Laden...

LINQ-Command mit variabler Parameteranzahl

Erstellt von Bonaqua vor 10 Jahren Letzter Beitrag vor 10 Jahren 723 Views
Hinweis von winSharp93 vor 10 Jahren

Abgetrennt von SQL-Command mit variabler Parameteranzahl

B
Bonaqua Themenstarter:in
35 Beiträge seit 2011
vor 10 Jahren

Ich verwende einfach mal den bestehenden Thread:
Ist eine solche Abfrage (mit variabler Paramteranzahl) auch über Linq möglich?
Wie könnte das dann aussehen?

Bspw. möchte ich eine unterschiedliche Anzahl an Artikelnummern vorab auswählen können und für diese Nummern dann eben entsprechend die Abfrage durchführen.

5.658 Beiträge seit 2006
vor 10 Jahren

Hi Bonaqua,

du kannst den obigen Code verwenden, wenn du das Resultat der Linq-Abfrage vorher in eine Liste oder in ein Array speicherst. Wenn du das vermeiden willst, brauchst du nur die for-Schleife durch eine foreach-Schleife ersetzen.

Christian

Weeks of programming can save you hours of planning

2.891 Beiträge seit 2004
vor 10 Jahren

Klar kannst du das mit LINQ machen. Üblicherweise wäre das Code wie


string[] articleNumbers = new [] { "ABC","DEF","GHI" };
var query = dataContext.Articles.Where(a => articleNumbers.Contains(a.ID));

Allerdings habe ich festgestellt, dass es da sehr große Unterschiede je nach QueryProvider (LINQ2SQL, Entity Framework, OpenAccess ORM, ...) gibt.
Es kann sein, dass entweder so ein Konstrukt gar nicht unterstützt wird (der QueryProvider weiß halt nicht, was er da für ein SQL draus basteln soll). Manchmal muss man auch bestimmte Dinge einhalten - z.B. gehen nur Arrays als Datentyp für die Liste, aber keine Listen oder IEnumerable allgemein. Manche QueryProvider mögen auch keine äußeren Variablen - wodurch man das Konstrukt überhaupt nicht so verwenden kann, wie man das will.

Die einzige Lösung, die für alle QueryProvider funktioniert, ist eine Transformation des Expression-Trees vor der Übergabe an den Provider. Wo dann der list.Contains(a.ID)-Ausdruck vollständig ausgerollt und durch ein entsprechendes (a.ID=="ABC" || a.ID=="DEF" || a.ID=="GHI") ersetzt wird.