我想在LINQ中生成此SQL语句:
select * from Foo where Value in ( 1, 2, 3 )
棘手的一点似乎是,该值是允许空值的列。
等效的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?
和
values
键入
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);没有
IN
DataContext日志中的子句。
是否有方法为可为空类型生成SQL-In?
注释
事实证明,我遇到的问题与contains或nullable没有任何关系,因此我问题的措词在很大程度上是不相关的。详情请参见@nick craver's accepted answer。