2010-11-22 20 views
26

jak mogę to przetłumaczyć na LINQ?Wybierz wielkość liter w 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 

Dziękujemy!

+1

ewentualne duplikaty - 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

Jeśli ktoś się z tym zetknął i zastanawiał się "jaka jest między nimi różnica" Tylko jeden może być duplikatem: stackoverflow.com/questions/436028/linq-to-sql-case-query i nie określa zakresów w tytule, ale jest to odpowiedź. Pozostałe są ograniczone do instrukcji case, ale w określonych sytuacjach. Odpowiedź zaznaczona w pytaniu nie ma nic wspólnego z zakresami, ponieważ pytanie określa ... tak ... – user1040975

Odpowiedz

39

Może to działa:

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 to pomogło mi na tak wiele sposobów! – A1rPun

0

Nie wiem w żaden sposób, jak utworzyć efektywny SQL w ten sposób, używając instrukcji LINQ. Ale możesz użyć:

  1. Użyj procedury przechowywanej (lub funkcji) i wywołaj procedurę przechowywaną z LINQ.
  2. Use Direct SQL

Oczywiście można korzystać z wielu wypowiedzi inline warunkowego (? :), ale nie sądzę, wynik będzie skuteczny.

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

Kopiuj/wklej z innej [odpowiedź] (http://stackoverflow.com/questions/936028/linq-case -statement/936136 # 936136) – abatishchev

+0

@ abatishchev- zmieniony Myślałem, że to dobry przykład, ale odpowiedź nie jest poprawiona przez inny przykład –

4

coś takiego?

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

użyć czegoś takiego:

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+"; 
     } 
    } 
} 

Reszta użytkownika @ Botz3000 odpowiedź:

from u in users 
let range = new AgeHelper()[u.Age] 
... 
Powiązane problemy