【发布时间】:2016-10-02 16:37:07
【问题描述】:
我是 Linq 表达式的新手。
我正在调用一个 API,它公开了以下重载方法:
CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, OrderBy orderBy = OrderBy.Ascending);
CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, Expression<Func<TEntity, bool>> predicate, OrderBy orderBy, params Expression<Func<TEntity, object>>[] useProperties)
我的意图是将“id”参数作为谓词的一部分传递,以便按传递的值进行过滤。
类似的东西:
x => x.UserId.Equals(id)
我的问题 - 是否可以从 API 的方法签名确定如何实现这种过滤?
我已经尝试过传递以下变体但无济于事:
Expression<Func<Group, int>> myFunc = u => u.UserId == id
错误:无法将 bool 转换为 int。
Func<Group, int> myFunc = g => g.UserId == id;
错误:无法从 System.Func 转换为 System.Linq.Expressions.Expression
我显然不太了解表达式树,可以使用一些友好的指导。提前感谢您的任何见解。
【问题讨论】:
-
您应该看看 Joseph Albahari 的谓词生成器。 albahari.com/nutshell/predicatebuilder.aspx
-
u.UserId == id返回一个布尔值,Expression<Func<Group, int>>需要一个int返回类型。你只是和参数混淆了,keySelector不是负责过滤的参数,它是名为predicate的下一个参数
标签: c# linq-expressions