如何在c#Linq中的Expressions.Expression中用空字符串替换null

时间:2015-03-18 10:27:06

标签: c# linq

我是linq c#的新手,以下是我的功能

public static IQueryable<T> BuildWhereExpression<T>(this IQueryable<T> query, SearchAttributes searchModel)
    {
        string FilterField = searchModel.FilterField;
        string FilterOperator = searchModel.FilterOperator;
        string FilterValue = searchModel.FilterValue;
        ParameterExpression ParamExp = Expression.Parameter(typeof(T), GlobalConstants.SearchExpressionName);
        Expression InitialExp;
        LambdaExpression FinalExp;

        switch (FilterOperator)
        {
            case GlobalConstants.IsEqualTo:
                if (FilterValue == "")
                    InitialExp = Expression.Call(Expression.PropertyOrField(ParamExp, FilterField), typeof(string).GetMethod("Contains"), Expression.Constant(FilterValue));
                else
                    InitialExp = Expression.Equal(Expression.PropertyOrField(ParamExp, FilterField), Expression.Constant(FilterValue));
                break;

            case GlobalConstants.Contains:
                { // This is what i havd tried till now
                    //var Column = Expression.PropertyOrField(ParamExp, FilterField);
                    //var isNull = Expression.Equal(Column, Expression.Constant(null));

                    //Expression left = Expression.Call(Column, typeof(string).GetMethod("ToString", System.Type.EmptyTypes));
                    //Expression left = Expression.Call(pe)
                }
                InitialExp = Expression.Call(Expression.PropertyOrField(ParamExp, FilterField), typeof(string).GetMethod("Contains"), Expression.Constant(FilterValue));
                break;

            case GlobalConstants.StartsWith:
                InitialExp = Expression.Call(Expression.PropertyOrField(ParamExp, FilterField), typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }), Expression.Constant(FilterValue));
                break;

            default:
                InitialExp = Expression.Constant(true);
                break;
        }
        FinalExp = Expression.Lambda<Func<T, bool>>(InitialExp, new ParameterExpression[] { ParamExp });
        MethodCallExpression result = Expression.Call(typeof(Queryable), "Where", new Type[] { query.ElementType }, query.Expression, Expression.Quote(FinalExp));

        return query.Provider.CreateQuery<T>(result);
    }

上面的代码动态地为列中的contains添加条件。 包含不适用于包含空值的列。 我该如何实现以下逻辑

如果 table.ColumnValue 为空,则将空列替换为null,然后使用 FilterValue

中的值进行复制

修改 我的意思是我如何实现查询 coalesce(table.column,string.empty)== FilterValue

请帮助我。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

您正在寻找的表达方式如下:

Expression<Func<T, bool>> exp = x => (x.FilterField ?? string.Empty).Contains(FilterValue);

可以通过

获得
var coalesce = Expression.Coalesce(
    Expression.PropertyOrField(ParamExp, FilterField),
    Expression.Constant(string.Empty))

所以

InitialExp = Expression.Call(coalesce, typeof(string).GetMethod("Contains"), Expression.Constant(FilterValue));

请注意,考虑到面向未来,我总是会明确告诉.NET我正在寻找的方法的参数:

typeof(string).GetMethod("Contains", BindingFlags.Instance | BindingFlags.Public, null, new[] { typeof(string) }, null);

因为你无法知道在.NET∞.0中,他们最终是否会添加一个支持StringComparison的重载: - )