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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Arbeit sollte für dein Beispiel:
Casting als
IEnumerable<T>
von Anfang bedeutet, wird die Ausführung außerhalb von SQL, stattdessen rufen Sie dieIQueryable<Foo>
direkt. Wenn Sie die Umwandlung alsIEnumerable
und verwenden Sie es in einer Abfrage, wird es alleMyDataContext.Foos
dann nutzt den iterator und führt den rest der Abfrage in C# statt in SQL.Wenn Sie möchten, führen Sie in SQL, nicht gegossen
IEnumerable
überall entlang des Weges. Der Effekt ist der gleiche wie mitMyDataContext.Foos.AsEnumerable()
in der Abfrage.