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)
我终于弄清楚如何动态构建表达式:
\n\nExpression<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();\nRun Code Online (Sandbox Code Playgroud)\n\n通用示例:
\n\nvar 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}\nRun Code Online (Sandbox Code Playgroud)\n\n感谢 David\xe2\x80\x99s 关于禁止客户端评估的回复,我能够验证过滤不会在客户端上执行
\n| 归档时间: |
|
| 查看次数: |
14846 次 |
| 最近记录: |