【发布时间】:2010-03-12 17:58:05
【问题描述】:
我想在 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 中,没有 -to-SQL); DataContext 日志中没有 IN 子句。
有没有办法为 Nullable 类型生成 SQL IN?
注意
事实证明,我遇到的问题与 Contains 或 Nullable 无关,因此我的问题的措辞在很大程度上是无关紧要的。有关详细信息,请参阅@Nick Craver 接受的答案。
【问题讨论】:
标签: sql linq linq-to-sql nullable