Я хочу сгенерировать этот оператор SQL в LINQ:
select * from Foo where Value in ( 1, 2, 3 )
Сложный бит состоит в том, что Value - это столбец, который допускает нулевые значения.
Эквивалентный код LINQ, по-видимомуbe:
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
.
Есть ли способ создать SQL IN для типов Nullable?
NOTE
Как выясняется, проблемаУ меня не было ничего, чтобы сделать Содержит или Nullable, и поэтому формулировка моего вопроса в значительной степени не имеет значения.См. Подробности в ответе Ника Крейвера.