LINQ-to-SQL IN / Contains()用于Nullable

前端之家收集整理的这篇文章主要介绍了LINQ-to-SQL IN / Contains()用于Nullable前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在LINQ中生成这个sql语句:
select * from Foo where Value in ( 1,2,3 )

棘手的一点似乎是Value是一个允许空值的列.

等效的LINQ代码似乎是:

IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
var myFoos = from foo in foos
             where values.Contains(foo.Value)
             select foo;

当然,这不会编译,因为foo.Value是一个int?和值的类型为int.

我试过这个:

IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
IEnumerable<int?> nullables = values.Select( value => new Nullable<int>(value));
var myFoos = from foo in foos
             where nullables.Contains(foo.Value)
             select foo;

…还有这个:

IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
var myFoos = from foo in foos
             where values.Contains(foo.Value.Value)
             select foo;

这两个版本都给了我期望的结果,但它们不会生成我想要的sql.它们似乎正在生成全表结果,然后在内存中进行Contains()过滤(即:在普通LINQ中,没有-to-sql); DataContext日志中没有IN子句.

有没有办法为Nullable类型生成sql IN?

注意

事实证明,我遇到的问题没有任何关系包含或Nullable,所以我的问题的措辞在很大程度上是无关紧要的.有关详细信息,请参阅@Nick Craver的接受答案.

解决方法

这适用于您的示例:
IEnumerable<int> values = GetMyValues();
var myFoos = from foo in MyDataContext.Foos;
             where values.Contains(foo.Value.Value)
             select foo;

作为IEnumerable转换< T>从一开始就意味着执行将在sql之外,而是调用IQueryable< Foo>直.如果您转换为IEnumerable并在查询中使用它,它将获取所有MyDataContext.Foos然后使用该迭代器并在C#中而不是在sql中执行查询的其余部分.

如果要在sql中运行,请不要在此过程中的任何位置转换为IEnumerable.效果与在查询中使用MyDataContext.Foos.AsEnumerable()相同.

猜你在找的MsSQL相关文章