2015-01-29 13 views
6

Wie würde dies in SQL aussehen (SQL Server, wenn Sie speziell sein wollen)?Was ist SQL entspricht LINQ .All()

// where people is a list of Person objects with property Name 
bool bobs = people.All(p => p.Name == "Bob"); 
+0

Was macht der Operator '.All()'? –

+0

Warum willst du so viel Bob? – Zane

+0

@ypercube: Es wird Wahr zurückgegeben, wenn die Bedingung für alle Elemente erfüllt ist. – Guffa

Antwort

5

Sie überprüfen würde, ob es irgendwelche Aufzeichnungen, die nicht den Kriterien überein:

not exists(select * from Persons where not Name = 'Bob') 

Da die Regeln für die zwischen C# und SQL anders null Vergleich, würden Sie für einen Zustand benötigen null-Werte, wenn das Feld ihnen erlaubt:

not exists(select * from Persons where Name <> 'Bob' or Name is null) 
+5

Kannst du das so umformulieren, dass es mein Gehirn nicht verletzt, es zu lesen? Vielleicht 'Where Name <> 'Bob'' – Zane

+2

Vereinbart,' Name <>' Bob'' ist viel intuitiver als 'nicht Name = 'Bob''. –

+1

@ Zane: Ich schrieb es so, um die Bedingung aus dem ursprünglichen Code erkennbar zu machen und mögliche Randfälle zu vermeiden. Natürlich können Sie den Operator '<>' verwenden, wenn Sie wissen, dass das Ergebnis gleich ist. – Guffa

3

ich bin nicht sicher, welche Abfrage genau Linq erstellen, sondern das Äquivalent in SQL ist die ALL op erator:

'Bob' = ALL (SELECT name FROM people) 
+0

In diesem Fall tut es das gleiche, aber der SQL-'all'-Operator ist nicht äquivalent zur' All'-Methode. Zum Beispiel kann eine Bedingung wie '.All (p => p.name == p.nick)' nicht leicht in die Verwendung des 'all'-Operators übersetzt werden. – Guffa

+0

@ Guffa. wahr. Und meine 'ALL'-Übersetzung wird zu Ihren' NOT EXISTS' andere Ergebnisse liefern, wenn der 'name' Nullwerte hat. Wenn Sie sicher sind, dass Linq das 'All()' übersetzt, um nicht existiert, sollte ich meine Antwort entfernen. –