2010-01-24 4 views
10

Ich bin auf der Suche nach einer einfachen Lösung zu ersetzen meine standardisierte Junk Weg zu prüfen, ob ein Datensatz existiert vor dem Versuch, die Daten abzurufen. Derzeit, wenn einer meiner Methoden aufgerufen werden, muss ich etwas in der Art von ...Überprüfen Sie die Existenz eines Datensatzes vor der Rückgabe der Ergebnismenge in LINQ to SQL

private Record DoSomething(int id) 
{ 
    if(data.Records.Count(q=>q.Id==id) > 0) 
    { 
     return data.Records.First(q=>q.Id==id); 
    } 
    return null; 
} 

... wo ich die Anzahl der Datensätze immer überprüfen, die Existenz eines Datensatzes zu bestimmen. Es muss einen "eleganteren" Weg geben, dies zu tun, ohne die Datenbank zweimal aufzurufen. Gibt es einen Weg?

Antwort

15

Es gibt viele saubere Möglichkeiten, damit umzugehen. Wenn Sie die erste Record entsprechend id möchten, können Sie sagen:

Record record = data.Records.FirstOrDefault(r => r.Id == id); 
if(record != null) { 
    // record exists 
} 
else { 
    // record does not exist 
} 

Wenn Sie nur wissen wollen, ob ein solches Record existiert:

return data.Records.Any(r => r.Id == id); // true if exists 

Wenn Sie eine Zahl wollen, wie viele solcher Record existiert :

return data.Records.Count(r => r.Id == id); 

Wenn Sie eine Aufzählung (IEnumerable<Record>) aller solcherwollen:

return data.Records.Where(r => r.Id == id); 
+0

Ich denke SingleOrDefault eine Exception aus, wenn mehr als ein Datensatz zurückgegeben wird. Da es wie eine Id-Abfrage aussieht, ist es wahrscheinlich sicher anzunehmen, dass SingleOrDefault in Ordnung wäre, aber FirstOrDefault ist allgemeiner, denke ich. –

+2

'Any (r => r.Id == id)' ist bevorzugt, weil es effizienter ist (wird zu einem "EXISTS" anstelle eines "COUNT" führen). – JulianR

1
Record record = data.Records.FirstOrDefault(q => q.Id == id); 
return record; 
Verwandte Themen