2012-04-05 40 views
7

Bir linq sorgum var. Topladığım bir formdan, kullanıcının aradığı alanlara göre filtrelemem gereken bir dizi parametrem var.Linq isteğe bağlı parametreler

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

Birkaç tane daha dizgi olmayan alan filtrelerim var Uzun ve boole içeren filtrelemeye ihtiyacım var. Kullanıcı bir şey seçmezse boş olabilirler. Bunları sorguya nasıl eklerim?

+0

Bu ürün bilinmiyor? Bir çeşit sorgu üreticisi gibi mi? – Jodrell

+0

Yani, 'model' sınıfı 'Kullanıcı' varlığının özniteliklerini eşleştirebilecek bazı keyfi özelliklere sahip mi, yoksa ilişki daha güçlü mü? – Jodrell

cevap

16

Bu, LINQ'nun neden bu kadar güçlü - ertelenmiş yürütmesinin en iyi örneklerinden biridir. Sorgu, belirli bir alan içermiyorsa

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

DataContext'e bağlıdır, ancak 'var 'öğesini kullanmak yerine' sorguyu 'IQunable <>' olarak tanımlamanız gerekebilir. Bazı sağlayıcılar, bunu 'IQueryable <> 'kullanan bir sınıf olarak var. Ayrıca 'Kullanıcılar' dan sonra bir 'AsQueryable()' üzerine de yapabilirsiniz. – Servy

+1

ayrıca 'query = query.Where (u => u.FirstName.Contains (model.FirstName));' if ifadenizde kullanabilirsiniz. Tercih ettiğiniz sözdiziminize bağlıdır. –

+0

@Servy Bunun için güncelledim. Güzel yakala, teşekkürler! – Yuck

5

, sen gerekmez: Sorgu nihayet infaz veya SQL deyimi oluşturulur çözülürse sadece farklı aşamalarında sorgu oluşturmak ve edebilirsiniz sen şartlı yuva Eğer gerçekten gereken sadece koşullara sahip olmak için bu şekilde yüklemler olabilir

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); 

: hiç nerede maddesinin parçası olarak dahil etmeyi.

+0

yardımcı oldu. – desiguy

İlgili konular