如何将函数(或表达式)传递到实体框架查询的where子句中

时间:2014-06-05 02:17:53

标签: entity-framework entity-framework-6

当我尝试做这样的事情时,我遇到了错误:

来自db.SomeDbSet中的s,其中IsValid选择s

错误告诉我它无法处理IsValid。

基本上,我尝试做的是根据链接的Where中的另一个dbSet进行过滤并执行任何操作,但它不会让我。

我已尝试过百万种不同的方式来表达,但我无法找到正确的方法并构建我自己的扩展方法,例如在哪里似乎也无法正常工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以粘贴你的IsValid功能吗?

在这种情况下,使用LINQ语法并将其转换为SQL语法是EF作业。 EF无法将您的功能转换为SQL。它只支持一定数量的具有明确SQL等效命令的函数。

您有两种选择:

1)将该功能重写为一系列受支持的表扬。这将变成一个SQL子查询,意味着单次访问数据库,例如:

// will only return records that have at least one related entity marked as full.
query.Where(m => m.ReletedEntities.Any(re => re.IsFull == true));

2)从数据库中获取所有数据,然后使用Linq,您的函数将使用数据。这将在内存中使用您的实际函数完成,该函数将为集合中的每个项目调用一次。您还必须加载相关的实体集合。或者它仍然是“转换为SQL查询的实体框架”,如果你使用你的函数将会失败。