LINQ-to-SQL/Contains() für Nullable<T>

Möchte ich zur Erstellung dieses SQL-statement in LINQ:

select * from Foo where Value in ( 1, 2, 3 )

Das knifflige bit scheint zu sein, dass Wert-ist eine Spalte, die null-Werte zulässt.

Den Gegenwert LINQ-code würde zu sein scheinen:

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

Dies ist natürlich nicht kompilieren, da foo.Value ist ein int? und values eingegeben wird, um int.

Habe ich versucht, dieses:

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;

...und so:

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

Diese beiden Versionen geben Sie mir die Ergebnisse, die ich erwarte, aber Sie erzeugen nicht die SQL ich will. Es scheint, dass Sie die Generierung von full-table-Ergebnisse und dann die Contains () - filtering in-memory (ie: in plain LINQ-ohne -zu-SQL), es gibt keine IN - Klausel in der DataContext melden.

Gibt es eine Möglichkeit zum generieren eines SQL-IN für Nullable-Typen?

HINWEIS

Als es stellt sich heraus, das problem war ich hatte nichts zu tun, Enthält oder null-Werte zulässt, und so die Formulierung meiner Frage ist weitgehend irrelevant. Siehe @Nick Craver ' s akzeptiert Antwort für details.

InformationsquelleAutor Craig Walker | 2010-03-12
Schreibe einen Kommentar