使用Expression<Func<T, string>>创建一个带有StartsWith、EndsWith和Contains的Linq表达式。

11

我想创建一个方法,该方法接受类型为Expression<Func<T, string>的表达式,并创建类型为Expression<Func<T, bool>>的表达式来使用StartsWithEndsWithContains方法过滤字符串属性,就像这些表达式一样:

.Where(e => e.MiProperty.ToUpper().StartsWith("ABC"));
.Where(e => e.MiProperty.ToUpper().EndsWith("XYZ"));
.Where(e => e.MiProperty.ToUpper().Contains("MNO"));

方法应该如下所示:
public Expression<Func<T, bool>> AddFilterToStringProperty<T>(Expresssion<Func<T, string>> pMyExpression, string pFilter, FilterType pFiltertype)

其中FilterType是一个枚举类型,包含三种操作(StartsWithEndsWithContains)中的三种之一。


8
去试试吧。如果不成功,请告诉我们,我们很乐意提供帮助。 - drdwilcox
2个回答

10

试试这个:

public static Expression<Func<T, bool>> AddFilterToStringProperty<T>(
    Expression<Func<T, string>> expression, string filter, FilterType type)
{
    return Expression.Lambda<Func<T, bool>>(
        Expression.Call(
            expression.Body,
            type.ToString(),
            null,
            Expression.Constant(filter)),
        expression.Parameters);
}

我已经在这个答案中添加了一个“非空”表达式。 - Rodrigo Caballero

4

感谢 @dtb。它运行良好,我为此添加了一个“非空”表达式,如下所示:

public static Expression<Func<T, bool>> AddFilterToStringProperty2<T>(
                        Expression<Func<T, string>> expression, string filter, FilterType type)
    {
        var vNotNullExpresion = Expression.NotEqual(
                                expression.Body,
                                Expression.Constant(null));

        var vMethodExpresion = Expression.Call(
                expression.Body,
                type.ToString(),
                null,
                Expression.Constant(filter));

        var vFilterExpresion = Expression.AndAlso(vNotNullExpresion, vMethodExpresion);

        return Expression.Lambda<Func<T, bool>>(
            vFilterExpresion,
            expression.Parameters);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接