【问题标题】:Linq Expression Trees and Filtering LogicLinq 表达式树和过滤逻辑
【发布时间】: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&lt;Func&lt;Group, int&gt;&gt; 需要一个 int 返回类型。你只是和参数混淆了,keySelector不是负责过滤的参数,它是名为predicate的下一个参数

标签: c# linq-expressions


【解决方案1】:

Expression&lt;Func&lt;TEntity, bool&gt;&gt;类型的参数perdicate是负责过滤的参数:

Expression<Func<Group, bool>> myFunc = u => u.UserId == id;

你需要匹配&lt;Group, bool&gt;而不是&lt;Group, int&gt;的签名

最终调用可以是:

var results = GetAll(someIndex, someMaxPage, x=> x.UserId, u => u.UserId == id);

或:

Expression<Func<Group, int>> myKeySelector = u => u.UserId;
Expression<Func<Group, bool>> myFilter = u => u.UserId == id;
var results = GetAll(someIndex, someMaxPage, myKeySelector, myFunc );

【讨论】:

  • 那是Expression&lt;Func&lt;Group, bool&gt;&gt; 不是Expression&lt;Func&lt;Group, int&gt;&gt;
  • @LucasTrzesniewski 正确。已更新。
  • OP 中似乎没有使用赋值运算符。忍者编辑,也许吧?
  • 我的意思是,这个问题仍然,无法回答 - 错误消息与代码不匹配,并且 OP 似乎不知道他在做什么。鉴于keySelector 变量名,他很可能只需要u =&gt; u.UserId
  • @LucasTrzesniewski 他只是对哪个参数负责过滤感到困惑。我想就是这样。答案已更新!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多