2012-04-05 28 views
7

Mam kwerendę linq. Mam kilka parametrów z formularza, który zbieram, gdzie muszę filtrować na podstawie pól, które użytkownik wyszukuje.Parametry opcjonalne Linq

IQueyable<Users> user = from user in edmxObject.Users 
where user.FirstName.Contains(model.FirstName ?? user.FirstName) 
&& user.UserName.Contains(model.UserName ?? user.UserName) 

Mam kilka innych nieciągowych filtrów pól, które muszę filtrować, w tym długie i boolean. Mogą one mieć wartość null, jeśli użytkownik niczego nie wybierze. Jak uwzględnić je w zapytaniu.

+0

Ta lista nie jest znana? Jak jakiś kreator zapytań? – Jodrell

+0

Tak więc klasa 'model' ma pewne dowolne właściwości, które mogą pasować do atrybutów jednostki użytkownika lub czy relacja jest silniejsza? – Jodrell

Odpowiedz

16

Jest to jeden z najlepszych przykładów, dlaczego LINQ jest tak potężny - odroczona realizacja. Można zbudować kwerendę w różnych fazach, i tylko wtedy, gdy kwerenda jest wykonywana w końcu zostanie rozwiązany lub SQL być generowane:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

To zależy od DataContext, ale możesz potrzebować zdefiniować 'query' jako' IQueryable <> ', zamiast używać' var'. Niektórzy dostawcy mają go jako klasę, która implementuje 'IQueryable <>'. Możesz również dodać "AsQueryable()' po 'Użytkownicy'. – Servy

+1

można również użyć 'query = query.Where (u => u.FirstName.Contains (model.FirstName)); wewnątrz instrukcji if. Zależy od preferowanej składni. –

+0

@Servy Zaktualizowałem do tego. Fajny połów, dzięki! – Yuck

5

Jeśli zapytanie nie zawiera konkretnego pola, nie trzeba umieścić go w ramach klauzuli jeśli w ogóle:

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

można warunkowo gniazdo orzeczników w ten sposób, aby upewnić się, że tylko warunki, których naprawdę potrzebujesz.

+0

dzięki, które pomogły. – desiguy

Powiązane problemy