2011-09-15 13 views
6

Mam pewną tabelę i następujący warunek zapytania: jeśli parametr A ma wartość null, weź wszystko, jeśli nie, użyj go w zapytaniu. Wiem, jak to zrobić w 2 krokach:Linq: jak wykluczyć warunek, jeśli parametr ma wartość null

List<O> list = null; 
if (A = null) 
{ 
    list = context.Obj.Select(o => o).ToList(); 
} 
else 
{ 
    list = context.Obj.Where(o.A == A).ToList(); 
} 

Czy można mieć to samo co jedno zapytanie? Dzięki

+2

myślę, że nie potrzebują 'select()' tam. – svick

+0

Mam nadzieję, że masz na myśli 'A == null'! (C# powinno to powstrzymać przed kompilacją, ale zawsze najlepiej jest upewnić się, że napisany kod jest w odpowiedniej kompilacji. Ważne jest, aby być krytycznym wobec opublikowanego kodu, ponieważ * skompilowałoby to [ale nie działało zgodnie z oczekiwaniami] w niektórych językach.) –

Odpowiedz

16

Jak o:

list = context.Obj.Where(o => A == null || o.A == A) 
        .ToList(); 

EDIT: Można to zrobić w jednym zapytaniu, ale nadal stosując warunek:

IEnumerable<O> query = context.Obj; 
if (A != null) 
{ 
    query = query.Where(o => o.A == A); 
} 
var list = query.ToList(); 
+0

W ten sposób stan "A == null" byłby oceniany dla każdego elementu kolekcji, chociaż jest bardziej czytelny, nie sądzę, że jest całkowicie poprawny. –

+1

@ AS-CII, niekoniecznie. Tak będzie w przypadku LINQ do obiektów. Ale to zapytanie wygląda jak LINQ na SQL lub coś podobnego. – svick

+0

Pozwól mi wypróbować ten. Dzięki. – mimic

3

to pewnie napisać kwerendę tak:

IQueryable<O> query = context.Obj; 
if (A != null) 
    query = query.Where(o => o.A == A); 
var list = query.ToList() 

To nie jest jedno wyrażenie, ale myślę, że jest całkiem czytelny. Ten kod zakłada także, że context.Obj jest IQueryable<O> (np. Używasz LINQ do SQL) Jeśli tak nie jest, po prostu użyj IEnumerable<O>.

0

spróbować

context.Obj.Where(a => A != null && a.A == A).ToList() 

powinny być dobre. Jeśli A ma wartość NULL, wówczas "a.A == A" zostanie zignorowane.

2

Zdecydowałem

var list = context.Obj.Where(o => A.HasValue ? o.a == A : true); 
Powiązane problemy