构建表达式来过滤数据 EF Core

Pav*_*vel 5 c# entity-framework linq-expressions ef-core-2.2

我需要重用可用的表达式:

Expression<Func<Picture, int>> selector = o => o.EntityId;
Run Code Online (Sandbox Code Playgroud)

并构建Where的表达式:

Expression<Func<Picture, bool>> filter = w => w.EntityId > 5;
Run Code Online (Sandbox Code Playgroud)

我怎样才能构建这样的表达式?

接下来的操作不会在客户端执行,对吗?

var collection = _dbContext.Pictures.Where(filter).ToList();
Run Code Online (Sandbox Code Playgroud)

Pav*_*vel 7

我终于弄清楚如何动态构建表达式:

\n\n
Expression<Func<Picture, int>> selector = o => o.EntityId;\n\nvar parameter = Expression.Parameter(typeof(Picture));\n\n// get property name\nif (!(selector.Body is MemberExpression memberExpression))\n{\n    memberExpression = ((UnaryExpression)selector.Body).Operand as MemberExpression;\n}\nvar propertyName = memberExpression.ToString().Substring(2);\n\nvar expressionParameter = Expression.Property(parameter, propertyName);\nvar expressionBody = Expression.GreaterThan(expressionParameter, Expression.Constant(5, typeof(int)));\n\nvar filter = Expression.Lambda<Func<Picture, bool>>(expressionBody, parameter);\nvar collection = _dbContext.Pictures.Where(filter).ToList();\n
Run Code Online (Sandbox Code Playgroud)\n\n

通用示例:

\n\n
var filter = CreateFilter<Picture, int>(o => o.EntityId, 5);\nvar collection = _dbContext.Pictures.Where(filter).ToList();\n\nprivate Expression<Func<TData, bool>> CreateFilter<TData, TKey>(Expression<Func<TData, TKey>> selector, TKey valueToCompare)\n{\n    var parameter = Expression.Parameter(typeof(TData));\n    var expressionParameter = Expression.Property(parameter, GetParameterName(selector));\n\n    var body = Expression.GreaterThan(expressionParameter, Expression.Constant(valueToCompare, typeof(TKey)));\n    return Expression.Lambda<Func<TData, bool>>(body, parameter);\n}\n\nprivate string GetParameterName<TData, TKey>(Expression<Func<TData, TKey>> expression)\n{\n    if (!(expression.Body is MemberExpression memberExpression))\n    {\n        memberExpression = ((UnaryExpression)expression.Body).Operand as MemberExpression;\n    }\n\n    return memberExpression.ToString().Substring(2);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢 David\xe2\x80\x99s 关于禁止客户端评估的回复,我能够验证过滤不会在客户端上执行

\n