Angenommen, meine Objekte funktionieren einwandfrei (d. H. TDD lässt mich glauben, dass sie funktionieren).Erstellen einer LINQ-Abfrage programmgesteuert, ohne dass lokale Variablen mich austricksen
Ich habe eine Liste, die ich so erstellen (außer eingekerbten richtig):
var result = from v in vendors
from p in v.Products
orderby p.Name
select p;
Das funktioniert - ich alle Produkte aller Anbieter.
Jetzt habe ich eine Liste von Bedingungen, die zur Laufzeit vom Benutzer aufgebaut werden. Lassen Sie uns sie anwenden:
foreach (Attribute a in requiredAttributes)
{
result = result.Where(p => p.Attributes.Contains(a));
}
Dies kann primitiv sein, aber ich dachte, es würde funktionieren. Nachdem diese foreach-Schleife beendet ist, wenn Sie "Ergebnis" aufzählen, wird es jedoch alle Produkte enthalten, die über das Attribut LAST der requiredAttributes-Auflistung in seiner Attributeigenschaft verfügen (auch eine Auflistung).
Für mich wird dieser Geruch wie "a" irgendwo bei jedem Trip durch die Schleife überschrieben, und nur der letzte gilt.
Kurz von irgendwie schreiben eine Erweiterungs-Methode zu IEnumerable namens ContainsAll (IEnumerable) oder etwas zu diesem Zweck, wie kann ich erreichen, was ich will, das ist im Grunde eine logische UND, mir nur die Produkte, die alle erforderlichen Attribute hat ?
Danke Jungs - Ich gebe Jon die "akzeptierte Antwort", da es scheint, dass es für den "allgemeinen" Fall besser geeignet wäre. Aber ich werde auf jeden Fall Omers Vorschlag überprüfen, wusste nicht, dass Sie das tun könnten. Stimmen für alle. :) –
Der neue Weg, um dieses Problem zu beheben, ist nur C# 5 zu verwenden. Siehe auch [Wurde foreachs Verwendung von Variablen in C# 5 geändert?] (Http://stackoverflow.com/a/12112959/18192) – Brian