我想在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?
类型,而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中,没有转换为SQL);在DataContext日志中没有IN
子句。
有没有办法为可空类型生成SQL IN语句?
注意
事实证明,我遇到的问题与Contains或Nullable无关,因此我的问题措辞在很大程度上是不相关的。请查看@Nick Craver的接受答案以获取详细信息。