2010-11-22 4 views
26

comment puis-je traduire cela en LINQ?Sélectionnez un cas dans LINQ

select t.age as AgeRange, count(*) as Users 
from (
    select case 
    when age between 0 and 9 then ' 0-25' 
    when age between 10 and 14 then '26-40' 
    when age between 20 and 49 then '60-100' 
    else '50+' end as age 
    from user) t 
group by t.age 

Merci!

+1

doublons possibles - http: // stackoverflow.com/questions/936028/linq-case-statement, http: // sta ckoverflow.com/questions/209924/switch-statement-in-linq, http://stackoverflow.com/questions/436028/linq-to-sql-case-query, http://stackoverflow.com/questions/936028/ linq-case-statement – pavanred

+0

Dans le cas où quelqu'un est tombé sur ceci et se demandait "quelle est la différence entre eux" Un seul est, peut-être, en double était: stackoverflow.com/questions/436028/linq-to-sql-case-query et ne spécifie pas de plages dans le titre, mais c'est la réponse. Les autres sont limités à des déclarations de cas, mais dans des scénarios spécifiques. La réponse marquée dans la question réelle n'a rien à voir avec les fourchettes comme la question le spécifie ... alors ... – user1040975

Répondre

39

Peut-être que cela fonctionne:

from u in users 
let range = (u.Age >= 0 && u.Age < 10 ? "0-25" : 
      u.Age >= 10 && u.Age < 15 ? "26-40" : 
      u.Age >= 15 && u.Age < 50 ? "60-100" : 
      "50+") 
group u by range into g 
select new { g.Key, Count=g.Count() }; 
+0

+1 Wow cela m'a aidé de tant de façons! – A1rPun

0

Je ne sais pas comment créer un SQL efficace comme ceci, en utilisant une instruction LINQ. Mais vous pouvez utiliser:

  1. Utilisez une procédure stockée (ou une fonction) et appelez la procédure stockée à partir de LINQ.
  2. Use Direct SQL

Bien sûr, vous pouvez utiliser un grand nombre de déclarations en ligne conditionnelles (? :), mais je ne pense pas que le résultat sera efficace.

11

check this may help you

var query = from grade in sc.StudentGrade 
         join student in sc.Person on grade.Person.PersonID 
             equals student.PersonID 
         select new 
         { 
          FirstName = student.FirstName, 
          LastName = student.LastName, 
          Grade = grade.Grade.Value >= 4 ? "A" : 
             grade.Grade.Value >= 3 ? "B" : 
             grade.Grade.Value >= 2 ? "C" : 
             grade.Grade.Value != null ? "D" : "-" 
         }; 
+1

Copier/coller d'un autre [answer] (http://stackoverflow.com/questions/936028/linq-case -statement/936136 # 936136) – abatishchev

+0

@ abatishchev- changé Je pensais que son bon exemple mais aucune réponse probs est mis à jour par un autre exemple –

4

Quelque chose comme ça?

var users = (from u in Users 
      select new 
      { 
       User = u, 
       AgeRange = 
        u.Age >= 0 && u.Age <= 9 ? "0-25" : 
        u.Age <= 14    ? "26-50" : 
        u.Age <= 49    ? "60-100": 
               "50+" 
       }).GroupBy(e => e.AgeRange); 
7

Utilisez quelque chose comme ça:

class AgeHelper 
{ 
    private static Dictionary<IEnumerable<int>, string> dic = new Dictionary<IEnumerable<int>, string> 
    { 
     { Enumerable.Range(0, 10), "0-25" }, 
     { Enumerable.Range(10, 5), "26-40" }, 
     { Enumerable.Range(15, 35), "60-100" } 
    }; 

    public string this[int age] 
    { 
     get 
     { 
      return dic.FirstOrDefault(p => p.Key.Contains(age)).Value ?? "50+"; 
     } 
    } 
} 

Le reste de la réponse de @ Botz3000:

from u in users 
let range = new AgeHelper()[u.Age] 
... 
Questions connexes