2010-01-24 5 views
10

Szukam prostego rozwiązania, które zastąpi mój standardowy sposób śmieciowego sprawdzania, czy rekord istnieje przed próbą pobrania danych. Obecnie, gdy jeden z moich metod nazywane są, mam coś do skutku ...Sprawdzanie istnienia rekordu przed zwróceniem zestawu wyników w LINQ do 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; 
} 

... gdzie ja zawsze sprawdzić liczbę rekordów w celu ustalenia istnienia rekordu. Musi to być bardziej "elegancki" sposób, bez dwukrotnego wywoływania bazy danych. Czy istnieje sposób?

Odpowiedz

15

Istnieje wiele czystych sposobów radzenia sobie z tym. Jeśli chcesz pierwszy Record odpowiadający id można powiedzieć:

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

Jeśli chcesz tylko wiedzieć, czy taka Record istnieje:

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

Jeśli chcesz rachubę, ile takich Record istnieje :

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

Jeśli chcesz wyliczenie (IEnumerable<Record>) wszystkich takich Record:

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

myślę SingleOrDefault rzuci wyjątek, jeśli zwracany jest więcej niż jeden rekord. Ponieważ wygląda na kwerendę Id, prawdopodobnie można założyć, że SingleOrDefault będzie w porządku, ale FirstOrDefault jest bardziej ogólny, jak sądzę. –

+2

'Dowolny (r => r.Id == id)' jest preferowany, ponieważ jest bardziej wydajny (spowoduje "EXISTS" zamiast "COUNT"). – JulianR

1
Record record = data.Records.FirstOrDefault(q => q.Id == id); 
return record; 
Powiązane problemy