2016-03-01 11 views
5

Ich glaube, es gibt eine bessere Möglichkeit, dies zu schreiben, aber ich erlebte eine mentale Blockade.Lambda-Ausdruck mit OR-Operator

int num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && 
          (x.FavoriteColor == "Green" || 
           x.FavoriteColor == "Blue" || 
           x.FavoriteColor == "Red")).Count(); 
} 

return num; 

Gibt es einen besseren Weg, um die OR Aussagen zu schreiben? Ich habe versucht:

x.FavoriteColor == "Green" || "Blue" || "Red" 

aber der Compiler sagt Operator || cannot be applied to operands of type 'bool' and 'string'

Jede Hilfe sehr geschätzt wird.

+1

Go für Lesbarkeit tauschen können. Ich glaube, Ihr aktuelles Beispiel ist sowohl lesbar als auch wartbar. Daran ist nichts falsch. Notieren Sie, wenn zwischen der 'using'- und der' return'-Anweisung nichts ist, können Sie 'db.Table.Where ... einfach zurückgeben' ' – Default

+0

Vielen Dank für die schnellen Kommentare und Antworten. Ich habe nicht erwartet, dass all diese Antworten so schnell passieren werden, haha, aber ich denke, das ist der Grund, warum SO # 1 ist. @Default Danke für den Hinweis. Ich werde sicher sein, das zu benutzen. Danke nochmal –

+0

@Servy guter Punkt, das habe ich verpasst. Entfernt den Kommentar, um Verwirrung zu vermeiden –

Antwort

6

Sie können Contains Methode von Array/Liste/hashset verwenden.

var colors = new List<string> {"Green", "Red", "Blue" }; 

db.Table.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

Es wird SQL-Abfrage erzeugen wie

SELECT ... WHERE FavoriteColor = 'Baseball' AND FavoriteColor in ("Green", "Red", "Blue") 

Ich möchte hinzufügen, dass, wenn Sie mit Datensätzen arbeiten, die in einem Speicher gespeichert sind Sie Contains O nimmt daran, dass List tragen sollte (N) Iteration, um das Ergebnis zu erhalten. Wenn also colors viele Elemente enthält, sollten Sie stattdessen HashSet mit O (1) verwenden.

var colors = new HashSet<string> {"Green", "Red", "Blue", .... }; 

someDataSet.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

können Sie finden List-HashSet Leistungsvergleich here

+0

Zeige immer das beste Beispiel zuerst IMO. Sie müssen nicht bis zum Ende Ihrer Antwort bearbeiten. – Default

+2

Aus Neugier, hätte ein Hashset eine Leistungssteigerung? Dies ist eine Abfrage an die Datenbank, die in dynamisches SQL übersetzt wird, so dass sie trotzdem die gesamte Sammlung durchlaufen sollte. –

+1

@Valentin Ok, ich stimme zu, eine Suche durch ein Hashset ist (manchmal) effizienter. Der Punkt, den ich mache, ist, dass dieser Befehl SQL generieren sollte (d. H. OP verwendet EF). Die generierte Abfrage sollte "SELECT ... WHERE FavoriteSport =" Baseball "UND FavoriteColor IN ( Rot", "Blau", "Grün") sein. Es müsste die gesamte Sammlung durchlaufen, um die IN-Anweisung zu generieren. –

4
string[] FavColor = new string[]{"Green","Red","Blue"}; 

int num = 0; 

    using(var db = new TestDB()) 
    { 
     num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&FavColor.Any(x.FavoriteSport)).Count(); 
    } 

    return num; 
3

Sie können einen Container von Objekten verwenden und das Verfahren enthält. Zum Beispiel:

var favoriteColors = new List<string> 
{ 
    "Blue", "Green", "Red" 
}; 
var num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && favoriteColors.Contains(x.FavoriteColor)).Count(); 
} 

Ich würde ein Profil überprüfen, um sicherzustellen, dass das generierte SQL die IN-Anweisung verwendet.

3

so ziemlich alles, was alle gesagt haben - Sie können eine Sammlung von gültigen Zeichenfolgen erstellen und sehen, ob Ihre Zeichenfolge in dieser Sammlung ist. Sie können es inline tun:

num = db.Table.Count(x => x.FavoriteSport == "Baseball" && 
         new []{"Green","Red","Blue"}.Contains(x.FavoriteColor); 

Bemerkenswert, dass Sie Ihre Where aus für Count direkt