2008-10-15 5 views
40

Wenn ich eine Tabelle mit einer Bedingung auf dem Tastenfeld Abfrage wie in zum Abrufen:beste Art und Weise einzelne Rekordergebnisse in LINQ to SQL

 var user = from u in dc.Users 
        where u.UserName == usn 
        select u; 

weiß ich, dass ich entweder Null Ergebnisse oder ein Ergebnis erhalten. Sollte ich trotzdem fortfahren und die Ergebnisse mit einem for-each abrufen oder gibt es einen anderen bevorzugten Weg, um mit dieser Art von Situation umzugehen.

+0

Danke für den Tipp auf FirstOrDefault oder SingleOrDefault. Es gibt eine Menge an LINQ, von der ich noch nicht viel benutzt habe, und ich kann sagen, dass da draußen viel mehr ist. –

Antwort

76

etwas wie dies Versuchen:

var user = (from u in dc.Users 
        where u.UserName == usn 
        select u).FirstOrDefault(); 

FirstOrDefault Die Methode gibt das erste Element eine Sequenz, die einen bestimmten Zustand oder einen Standardwert, wenn kein solches Element gefunden wird, erfüllt.

+1

es funktioniert nicht für linq zu sql –

17

Warum nicht so etwas wie

var user = dc.Users.SingleOrDefault(u=> u.UserName==usn); 
+7

FirstOrDefault führt eine TOP 1-Operation zur Effizienz durch. Leider macht SingleOrDefault keine TOP 2 und wählt den gesamten Satz aus. – DamienG

+0

Nicht sicher, ob das immer ganz richtig ist, vielleicht abhängig von der Version oder der genauen Syntax. Ich sehe SQL-Anweisungen wie diese, wenn ich SingleOrDefault verwende: "SELECT TOP (2) col1, col2 FROM (SELECT col1, col2) AS Extent1 WHERE ..." Also ist es sowohl Top 2 als auch nicht. ;-) – Culme

1

ich die SingleOrDefault Methode verwenden würde.

var user = (from u in dc.Users 
        where u.UserName == usn 
        select u).SingleOrDefault(); 
4

Ich würde First() oder FirstOrDefault() verwenden.

Der Unterschied: Bei First() wird eine Ausnahme ausgelöst, wenn keine Zeile gefunden werden kann.

5

Es sollte auch beachtet werden, dass First/FirstOrDefault/Single/SingleOrDefault der Punkt der Ausführung für einen LINQ to Sql-Befehl ist. Da die LINQ-Anweisung zuvor nicht ausgeführt wurde, kann sie das generierte SQL beeinflussen (z. B. kann sie dem Befehl sql eine TOP 1 hinzufügen)

+0

Nur die Informationen, die ich suchte. Vielen Dank – Sal

0

Eine weitere Option ist die Verwendung von Contains (Benutzername) im Gegensatz zu " == "