由于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?
答案 0 :(得分:0)
在这种情况下你可以尝试使用Entity SQL,它有IN子句支持
PS实际上在.net 3.5中使用EF时,我们只使用EntitySQL,因为它为复杂的查询提供了更可预测和更快的结果
答案 1 :(得分:0)
MSDN的解决方法是生成OR序列,因为EFv1中的LINQ提供程序不支持IN运算符,并且无法使用LINQ生成它。
如果您想使用LINQ而不是ESQL,您唯一的选择就是升级到EFv4。