2010-11-22 28 views
26

làm cách nào tôi có thể dịch điều này vào LINQ?Chọn trường hợp trong 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 

Cảm ơn bạn!

+1

bản sao có thể - 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

Trong trường hợp ai đó bắt gặp điều này và tự hỏi "sự khác biệt giữa chúng là gì" Chỉ có một, có thể, trùng lặp là: stackoverflow.com/questions/436028/linq-to-sql-case-query và nó không chỉ định phạm vi trong tiêu đề, tuy nhiên đó là câu trả lời. Những người khác được giới hạn trong các tuyên bố trường hợp, nhưng trong các tình huống cụ thể. Câu trả lời được đánh dấu trong câu hỏi thực tế không liên quan gì đến phạm vi như câu hỏi chỉ định ... do đó .... – user1040975

Trả lời

39

lẽ công trình này:

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 điều này đã giúp tôi bằng nhiều cách! – A1rPun

0

Tôi không biết cách nào để tạo SQL hiệu quả như thế này, sử dụng câu lệnh LINQ. Nhưng bạn có thể sử dụng:

  1. Sử dụng thủ tục lưu trữ (hoặc chức năng) và gọi thủ tục được lưu trữ từ LINQ.
  2. Use Direct SQL

Chắc chắn bạn có thể sử dụng rất nhiều các báo cáo nội tuyến có điều kiện (? :), nhưng tôi không nghĩ rằng kết quả sẽ là hiệu quả.

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

Sao chép/dán từ [answer] khác (http://stackoverflow.com/questions/936028/linq-case -statement/936136 # 936136) – abatishchev

+0

@ abatishchev- thay đổi Tôi nghĩ rằng ví dụ tốt của nó nhưng không có câu trả lời probs được cập nhật bởi một ví dụ khác –

4

Something như thế này?

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

Sử dụng một cái gì đó như thế:

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

Phần còn lại của câu trả lời @ Botz3000 của:

from u in users 
let range = new AgeHelper()[u.Age] 
... 
Các vấn đề liên quan