LINQ

2010-11-22 8 views
26

में केस का चयन करें मैं इसे LINQ में कैसे अनुवाद कर सकता हूं?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 

धन्यवाद!

+1

संभावित डुप्लिकेट - 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

यदि कोई इस पर आया और सोचता है कि "उनके बीच क्या अंतर है" केवल एक है, शायद, डुप्लिकेट था: stackoverflow.com/questions/436028/linq-to-sql-case-query और it शीर्षक में श्रेणियां निर्दिष्ट नहीं करता है, हालांकि यह जवाब है। अन्य मामले के बयान तक सीमित हैं, लेकिन विशिष्ट परिदृश्यों में। वास्तविक प्रश्न में चिह्नित उत्तर में सीमाओं के साथ कुछ लेना देना नहीं है क्योंकि प्रश्न निर्दिष्ट करता है ... इसलिए .... – user1040975

उत्तर

39

हो सकता है कि यह काम करता है:

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 वाह यह मुझे कई तरीकों से मदद करता है! – A1rPun

0

मुझे LINQ कथन का उपयोग करके इस तरह कुशल एसक्यूएल बनाने के तरीके के बारे में पता नहीं है। लेकिन आप इसका उपयोग कर सकते हैं:

  1. संग्रहित प्रक्रिया (या फ़ंक्शन) का उपयोग करें, और संग्रहित प्रक्रिया को LINQ से कॉल करें।
  2. Use Direct SQL

सुनिश्चित करें कि आप इनलाइन सशर्त बयान (? :) का एक बहुत उपयोग कर सकते हैं, लेकिन मुझे नहीं लगता कि परिणाम कुशल हो जाएगा।

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

किसी अन्य [उत्तर] से कॉपी/पेस्ट करें (http://stackoverflow.com/questions/936028/linq-case -स्टेटमेंट/936136 # 936136) – abatishchev

+0

@ abatishchev- बदल गया मैंने इसका अच्छा उदाहरण सोचा लेकिन किसी भी उदाहरण का जवाब किसी अन्य उदाहरण द्वारा अपडेट नहीं किया गया है –

4

इस तरह?

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

ऐसा ही कुछ का उपयोग करें:

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

@ Botz3000 के जवाब के बाकी:

from u in users 
let range = new AgeHelper()[u.Age] 
... 
संबंधित मुद्दे