【发布时间】:2018-11-16 05:09:14
【问题描述】:
我想使用 linq 表达式为我的存储库创建一个动态过滤器,我有其他过滤器,但我不知道如何使用表达式制作下一个过滤器:(条件取自 here)
var result = _studentRepotory.GetAll().Where(s =>
SqlFunctions.StringConvert((double)s.Id).Contains("91")).ToList();
我有一个接收属性值的方法,propertyName 和过滤器操作符类型(枚举):
public static class Helper {
public static Expression<Func<T, bool>> GetExpression<T>(object value, string propertyName, FilterOperatorType FilterType)
{
var parameter = Expression.Parameter(typeof(T));
var property = ExpressionUtils.GetPropertyChild(parameter, propertyName);
var constValue = Expression.Constant(value);
BinaryExpression expresion = null;
switch (FilterType)
{
case FilterOperatorType.Equal:
expresion = Expression.Equal(property, constValue);
break;
case FilterOperatorType.Greater:
expresion = Expression.GreaterThan(property, constValue);
break;
case FilterOperatorType.Less:
expresion = Expression.LessThan(property, constValue);
break;
case FilterOperatorType.GreaterOrEqual:
expresion = Expression.GreaterThanOrEqual(property, constValue);
break;
case FilterOperatorType.LessOrEqual:
expresion = Expression.LessThanOrEqual(property, constValue);
break;
}
var lambda = Expression.Lambda<Func<T, bool>>(expresion, parameter);
return lambda;
}
}
所以,我想添加一个新的运算符类型 Contains 来评估一个整数是否包含一些数字,在我做的第一个代码块中,但我想用 linq 表达式来做使用泛型。
最后我会:
Expression<Func<Student, bool>> where = Helper.GetExpression<Student>("91", "Id", FilterOperatorType.Contains);
var result = _studentRepotory.GetAll().Where(where).ToList();
当 ID 包含数字 91 时,查询应该返回所有学生。
请帮助我,如果你明白,请告诉我。
【问题讨论】:
-
没有开箱即用的方法,您需要创建一个
MethodCallExpression -
用谷歌搜索
predicatebuilder库/类。我最近用过这个:gist.github.com/anomepani/… -
@MrinalKamboj 我还有其他字符串过滤器,我使用的是 Expression.Call 但我不知道该怎么做。
标签: c# linq linq-expressions