/// <summary> /// 构建lamda表达式的语句 /// </summary> /// <param name="condition"></param> /// <param name="column"></param> /// <returns></returns> private string GenerateCode(SearchConditionDto condition, ColumnInfo column) { var value = condition.Value; var valuePath = $"o.{column.ValuePath}"; if (column.IsPropertyColumn) { //自定义属性列的查询 var dbFuncName = GetDbFunctionName(column.ColumnType); valuePath = $"MasterDbContext.{dbFuncName}(o.Property,\"$.{column.ColumnKey}\")"; } if (column.ColumnType != ColumnTypes.Number) { value = $"\"{value}\""; } if (column.ColumnType == ColumnTypes.DateTime) { //日期类型需要转换 value = $"DateTime.Parse({value})"; } //以.开头的为字符串操作 if (condition.Operator.StartsWith(".")) { //加括号:a.StartsWith("b") value = $"({value})"; } else if (string.IsNullOrEmpty(condition.Value)) { //非字符串操作,如果未传值,作null处理 value = "null"; } return($"(o)=>{valuePath}{condition.Operator}{value}"); }
private string GenerateLamdaCode <TEntity>(SearchConditionDto condition, ColumnInfo column, out LambdaExpression dbLamda) { dbLamda = null; var value = condition.Value; var valuePath = $"{column.ValuePath}"; if (column.IsPropertyColumn) { //自定义属性列的查询 //var dbFuncName = GetDbFunctionName(column.ColumnType); //var p = Expression.Parameter(typeof(TEntity), "x"); //var _pExp = Expression.Constant($"$.{column.ColumnKey}", typeof(string)); //MemberExpression member = Expression.PropertyOrField(p, "Property"); //var expRes = Expression.Call(typeof(TEntity).GetEntityDbContextType().GetMethod(dbFuncName), member, _pExp); //dbLamda = Expression.Lambda(expRes, p); dbLamda = GeneratePropertyLamda <TEntity>(column.ColumnType, column.ColumnKey); //valuePath = $"MasterDbContext.{dbFuncName}(Property,\"$.{column.ColumnKey}\")"; //基于数据库json字段的查询需要动态构建lamda valuePath = "@0(it)";//@0之后会由dbLamda代入 } if (column.ColumnType != ColumnTypes.Number) { value = $"\"{value}\""; } if (column.ColumnType == ColumnTypes.DateTime) { //日期类型需要转换 value = $"DateTime.Parse({value})"; } //以.开头的为字符串操作 if (condition.Operator.StartsWith(".")) { //加括号:a.StartsWith("b") value = $"({value})"; } else if (string.IsNullOrEmpty(condition.Value)) { //非字符串操作,如果未传值,作null处理 value = "null"; } return($"{valuePath}{condition.Operator}{value}"); }