2009-01-14 9 views
32

Est-il possible d'utiliser If Else conditionnel dans une requête LINQ?Si autre dans LINQ

Quelque chose comme

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 
} 

Répondre

51

Cela pourrait fonctionner ...

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

Il sera intéressant de voir si cela fonctionne ... si elle oui, j'adorerais voir le TSQL (en supposant que le chargement soit passionnant, pour un chargement paresseux, probablement pas trop terrible). –

+1

Cela devrait fonctionner. Le "?:" Est traduit en une expression "case" et il y a des sous-requêtes. –

+1

Devrait n'est pas fait. Ce serait bien d'avoir la confirmation que cela fonctionne. Très utile si c'est le cas. –

7

Je suppose de db que ce LINQ to SQL Framework/entité/similaire (non LINQ-à-objets);

Généralement, vous faites mieux avec la syntaxe conditionnelle (a? B: c) - cependant, je ne sais pas si cela fonctionnera avec vos différentes requêtes comme ça (après tout, comment écririez-vous le TSQL?) .

Pour un exemple trivial du type de chose que vous pouvez faire:

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

Vous pouvez faire beaucoup plus riches choses, mais je doute vraiment que vous pouvez choisir la table au conditionnel. Vous êtes invités à essayer, bien sûr ...

3

réponse ci-dessus ne convient pas pour compliquer l'expression Linq. Tout ce que vous avez besoin est:

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

vous devriez changer comme ceci:

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

mon exemple:

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