LINQ to EF(3.5) - 生成的SQL不能真正使用WHERE'IN'

时间:2011-10-25 20:16:14

标签: sql entity-framework linq-to-entities

由于EF 3.5不支持.Contain()方法中的集合参数,我看到很多人建议使用自定义表达式来解决这个问题(http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0)。

但是,如果我有一长串ID来过滤掉生成的SQL,在这种情况下包含一个无穷无尽的OR列表。例如,

WHERE (99999 = [Extent1].[ID]) OR (99998 = [Extent1].[ID]) OR (99997 = [Extent1].[ID]) OR...

这个生成的SQL需要永远在我的计算机上执行,但是一旦我将OR更改为“true”IN子句:

WHERE [Extent1].[ID] IN (99999,99998,99997...)

它在不到一秒的时间内完成。

我的问题是如何让LINQ生成一个“真正的”IN子句而不是OR?

2 个答案:

答案 0 :(得分:0)

在这种情况下你可以尝试使用Entity SQL,它有IN子句支持

[NOT] IN on MSDN

PS实际上在.net 3.5中使用EF时,我们只使用EntitySQL,因为它为复杂的查询提供了更可预测和更快的结果

答案 1 :(得分:0)

MSDN的解决方法是生成OR序列,因为EFv1中的LINQ提供程序不支持IN运算符,并且无法使用LINQ生成它。

如果您想使用LINQ而不是ESQL,您唯一的选择就是升级到EFv4。