2009-01-14 13 views
32

Czy można użyć warunku If Else w zapytaniu LINQ?If Else in LINQ

Coś

from p in db.products 
if p.price>0 
select new 
{ 
    Owner=from q in db.Users 
     select q.Name 
} 
else 
select new 
{ 
    Owner = from r in db.ExternalUsers 
      select r.Name 
} 

Odpowiedz

51

To może działać ...

from p in db.products 
    select new 
    { 
     Owner = (p.price > 0 ? 
      from q in db.Users select q.Name : 
      from r in db.ExternalUsers select r.Name) 
    } 
+2

To będzie interesujące zobaczyć, czy działa ... jeśli to Czy, chciałbym zobaczyć TSQL (zakładając, że niecierpliwe ładowanie, dla leniwego ładowania, prawdopodobnie nie jest zbyt straszne). –

+1

To powinno zadziałać. "?:" Jest tłumaczone na wyrażenie "case" i istnieją podzapytania. –

+1

Nie należy tego robić. Miło jest mieć potwierdzenie, że to działa. Bardzo przydatne, jeśli tak. –

7

zakładam od db że to Entity Framework LINQ-SQL// podobne (nie LINQ-Objects);

Ogólnie rzecz biorąc, lepiej ze składnią warunkową (a? B: c) - nie wiem jednak, czy będzie działać z różnymi zapytaniami takimi jak to (przecież jak napisałbyś TSQL?) .

Dla trywialny przykład typu rzeczy ty może zrobić:

select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" }; 

Można zrobić znacznie bogatsze rzeczy, ale wątpię można wybrać tabelęw warunkowej. Jesteś mile widziany spróbować, oczywiście ...

3

Odpowiedź powyżej nie nadaje się do wyrażenia Linq komplikować. Wszystko czego potrzebujesz to:

// set up the "main query" 
var test = from p in _db.test select _db.test; 
// if str1 is not null, add a where-condition 
if(str1 != null) 
{ 
    test = test.Where(p => p.test == str); 
} 
1

należy zmienić tak:

private string getValue(float price) 
{ 
    if(price >0) 
     return "debit"; 
    return "credit"; 
} 

//Get value like this 
select new {p.PriceID, Type = getValue(p.Price)}; 
1

mój przykład:

companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();