linq 如何将 predicate 正确地传递给包含的导航属性的“where”方法?

but5z9lq  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(170)

我需要根据条件为linq查询的included属性构造“where” predicate 。为了达到这个目的,我使用表达式,在结果中我得到了Func<in T, out TResult>类型的 predicate 。但是当我试图将 predicate 传递给included属性的.Where()方法时,我得到了异常:

var result = query
    .Include(x => x.Collection.Where(predicate))
    .ToList();

例外情况:

Expression of type 'System.Func`2[...]' cannot be used for parameter of type 'System.Linq.Expressions.Expression`1[System.Func`2[...]]' of method 'System.Linq.IQueryable`1[...] Where[...](System.Linq.IQueryable`1[...], System.Linq.Expressions.Expression`1[System.Func`2[...]])' (Parameter 'arg1')

但是直接传递等价于 predicate 的lambda不会引起任何问题:

var result = query
    .Include(x => x.Collection.Where(c => someCondition1(c) && someCondition2(c)))
    .ToList();
e4yzc0pl

e4yzc0pl1#

Linq需要能够分解 predicate 表达式,从中创建SQL语句。

Func<Item, bool> predicate = (c => someCondition1(c) && someCondition2(c);

它必须是:

Expression<Func<Item, bool>> predicate = (c => someCondition1(c) && someCondition2(c);

相关问题