2012-09-09 17 views
6

Masz jakieś sugestie dotyczące budowania instrukcji LINQ na podstawie kryteriów wyszukiwania?Warunkowo GDZIE w LINQ

Będę przechodzić w instancji klasy "SearchCriteria" z wszystkimi parametrami zerowymi.

Następnie chcę

if (sc.a != null) 
    // add to where 

if (sc.b != null) 
    // add to where 

Kluczową rzeczą jest to, aby nie być oddalonych łączeniu.

Jakieś wskazówki?

A dla punktów bonusowych chciałbym użyć "zawiera" na int? ale mogę uzyskać tylko równe lub nie równe.

+0

"lub" jest trudne do połączenia; robić właściwie, co obejmuje drzewa ekspresji i często odwiedzający/przepisujący. Ile masz zmiennych? Tylko dwa? Jeśli tak, szczerze robiąc to w sposób wyczerpujący (tj. 3 różne regularne linie - jeden X, jeden Y, jeden X || Y) –

+0

Co ORM? LINQ do SQL lub Entities Framework? – abatishchev

+0

będzie potencjalnie kilkanaście parametrów .. i używam EF .... –

Odpowiedz

4

Spróbuj:

.Where(x => 
    (x.a != null ? x.a == a : false) && 
    (x.b != null ? x.b == b : false)); 

lub

.Where(x => 
    (x.a != null && x.a == a) || 
    (x.b != null && x.b == b)); 

również:

.Where(x => new int[] { 1, 2, 3 }.Contains(x.i)); 
+0

&& powinien być || ? –

+0

@Marc: Lub 'false' w prawej ręce operatora'?: '. Poprawny? – abatishchev

+0

To wydaje się być czystym i eleganckim rozwiązaniem ... Zobaczę, jak dobrze się skaluje. Re druga część. Co mam jest int OrderID z 12345 Chcę móc wyszukać 123 i znaleźć 123 * z ciągami, które możesz zrobić. Zawiera, ale nie możesz z ints? Czy to może zadziałać? –