2009-01-14 39 views
32

¿Es posible usar If Else conditional en una consulta LINQ?If Else in LINQ

Algo así como

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 
} 

Respuesta

51

Esto podría funcionar ...

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

Será interesante ver si funciona ... si lo hace, me encantaría ver el TSQL (suponiendo que carga ansiosamente, para carga lenta, probablemente no demasiado terrible). –

+1

Esto debería funcionar. El "?:" Se traduce a una expresión de "caso" y hay subconsultas. –

+1

Deber no es así. Sería bueno tener la confirmación de que esto funciona. Muy útil si lo hace. –

7

Asumo db de que este es LINQ a SQL/Entity Framework/similar (no LINQ a Objetos);

Por lo general, se mejora con la sintaxis condicional (a? B: c); sin embargo, no sé si funcionará con sus diferentes consultas de ese tipo (después de todo, ¿cómo escribiría el TSQL?) .

Para un ejemplo trivial del tipo de cosas que uno puede hacer:

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

Se pueden hacer cosas mucho más ricos, pero realmente dudar se puede recoger la mesaen condicional. Le invitamos a probar, por supuesto ...

3

respuesta anterior no es adecuado para la expresión LINQ complican. Todo lo que necesita es:

// 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

debe cambiar así:

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

mi ejemplo:

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