实体框架 - 动态组合谓词

时间:2017-11-28 20:55:20

标签: c# entity-framework

在执行EF查询时,组合这样的谓词会导致堆栈溢出异常。这有什么问题?

Func<Item, bool> wherePredicate = i => i.isDeleted;
Func<Item, bool> wherePredicate2 = i => i.isExpired;

wherePredicate = i=> wherePredicate(i) || wherePredicate2(i);

1 个答案:

答案 0 :(得分:0)

你创建了递归循环,可能是偶然的。 用:

wherePredicate = i=> wherePredicate(i) || wherePredicate2(i);

你只是定义匿名函数,其中i=> wherePredicate(i) (...)将被调用,因此它将调用自己。诸如“在'='之前的所有内容的所有内容将在分配之前被调用”的常见规则不适用于您可能已经想到的那样,因为函数是分配的内容,而不是结果。

更重要的是(您标记了实体框架) - 它在.Where()子句中不起作用。简短回答 - EF不知道如何在数据库中调用Func<>。 答案很长 - 请参阅LINQKit,它将帮助您定义可重用的谓词。奇怪的重合 - 你的问题几乎在“结合表达”部分解释。