“where x in”-SQL Query mit LINQ

SQL Queries für eine “in”-Selektion zu schreiben, kann für Listen in .NET mühsam sein… muss es aber nicht!

Wir machen aus: List<CarType> largeTypeList

ganz einfach: SELECT * FROM CARS WHERE type in ('Audi', 'Ford', 'BMW', 'Nissan', ...)

Dank LINQ lässt sich eine Liste in ein “in”-Query verwandeln.

Beispiel

Stellen wir uns vor, wir haben eine Liste von Modell-Typen für Autos. In dieser Liste werden unzählige Modell-Typen gefüllt, welche wir anschließend auf der Datenbank selektieren würden. Ohne LINQ würde das ganze in etwa so aussehen:

List<CarType> largeTypeList = new List<CarType>() { /* fill with many objects */ };
string queryString = "SELECT * FROM CARS WHERE type in (";
for(var CAR_TYPE in largeTypeList)
{
  queryString += "'" + CAR_TYPE.Name + "',"; // add name in string formatted and append comma
}
if(largeTypeList.Count > 0)
  queryString.Remove(queryString.Length -1, 1); // remove last comma if list is finished

queryString += ")";

So oder so ähnlich würde das mit einer Schleife und einem String aussehen. Sicher könnte man das ganze mit einem StringBuilder noch ein Stück weit performanter machen, wenn die Liste WIRKLICH groß ist, aber meist spielt das eher weniger eine Rolle.

Schlanker und aufgeräumter geht das ganze mit LINQ:

List<CarType> largeTypeList = new List<CarType>() 
{ /* fill with many objects */ };

string whereQuery = string.Join(",", largeTypeList
  .Select(T => $"'{T.Name}"'").ToArray());

string queryString = $"SELECT * FROM CARS WHERE type in({whereQuery})";

Die Erklärung

Was passiert hier nun? Ganz einfach: zuerst erstellen wir uns eine einfache List<string> indem wir mit der LINQ-Funktion Select() uns die Namen der jeweiligen Typen extrahieren. Gleichzeitig setzen wir vor und hinter dem Namen ein Hoch-Komma. Das Ergebnis wäre also das gleiche, als würden wir folgendes schreiben:

List<string> modelNameList = new List<string>()
{
  "'Audi'", "'Ford'", "'BMW'", "'Nissan'"
};

Mit der string.Join()-Methode können wir diese Liste nun ganz einfach “zusammen ziehen”. Der erste Parameter gibt den Trenner an (in unserem Falle ein einfaches Komma), der zweite erwartet ein Array. Da wir hier noch eine List<> haben müssen wir also noch am Ende sagen .ToArray(), damit das ganze auch als Parameter passt.

Durch dies Methode sparen wir uns gleichzeitig auch das entfernen des letzten Kommas, da string.Join() immer nur zwischen den Einträgen den Trenner setzt.