SQL से एंटिटी फ्रेमवर्क काउंट ग्रुप-बाय


जवाबों:


180

क्वेरी सिंटैक्स

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

विधि वाक्यविन्यास

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

संपादित करें: EF Core 2.1 अंत में GroupBy का समर्थन करता है

लेकिन हमेशा संदेश के लिए कंसोल / लॉग में देखें। यदि आप एक सूचना देखते हैं कि आपकी क्वेरी को SQL में परिवर्तित नहीं किया जा सकता है और इसका स्थानीय स्तर पर मूल्यांकन किया जाएगा तो आपको इसे फिर से लिखने की आवश्यकता हो सकती है।


एंटिटी फ्रेमवर्क 7 (अब नाम बदलकर एंटिटी फ्रेमवर्क कोर 1.0 / 2.0 ) अभी तक GroupBy()अनुवाद के लिए समर्थन नहीं करता हैGROUP BY उत्पन्न SQL में (यहां तक ​​कि अंतिम 1.0 रिलीज में यह नहीं होगा)। कोई भी समूहीकरण तर्क क्लाइंट की तरफ चलेगा, जिससे बहुत अधिक डेटा लोड हो सकता है।

आखिरकार इस तरह लिखा कोड ग्रुप बीवाई का उपयोग करना स्वचालित रूप से शुरू कर देगा, लेकिन अब आपके लिए बहुत सावधानी बरतने की आवश्यकता है यदि आपके पूरे अन-ग्रुपेड डेटासेट को मेमोरी में लोड करने से प्रदर्शन समस्याएँ पैदा होंगी।

परिदृश्यों के लिए जहां यह एक सौदा-ब्रेकर है, आपको हाथ से एसक्यूएल लिखना होगा और इसे ईएफ के माध्यम से निष्पादित करना होगा।

यदि संदेह में, एसकेएल प्रोफाइलर को आग लगा दी जाए और देखें कि क्या उत्पन्न होता है - जो आपको वैसे भी करना चाहिए।

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


5
सिर के लिए धन्यवाद
याकूब स्टैम

4
इसके अलावा 1.1 में कोई समूहीकरण नहीं
शमौन_वेर

4
या 1.2 या 2.0। मैं छोड़ देता हूं
सिमोन_विवर

4
यह 2.1 के लिए घोषित है
युसु नोव

यह भ्रामक हो सकता है, मुझे लगता है कि आपके उत्तर को अपडेट करना महत्वपूर्ण है और स्पष्ट रूप से उल्लेख किया गया है कि ईएफ 7 की तुलना में ईएफ संस्करण पहले ग्रुपिंग का समर्थन करते हैं। यह उत्तर जो ओपी प्रश्न के वास्तविक उत्तर की तुलना में टिप्पणी का अधिक है, स्वयं द्वारा पढ़े जाने पर भ्रामक है (और ओपी के उत्तर के रूप में व्याख्या की जाती है जो नहीं है)। इसे पढ़ते समय, कोई गलत धारणा प्राप्त कर सकता है जैसे कि ईएफ 7 भी ग्रुपिंग का समर्थन नहीं करता है और जाहिर है कि पहले के संस्करण इसका समर्थन नहीं करते हैं जो कि सही नहीं है।
10

14

Dictionaryफास्ट लुकअप (जैसे लूप में) के लिए परिणाम एकत्र करना एक उपयोगी विस्तार है :

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);

मूल रूप से यहां पाया गया: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c


1

यहाँ .net core 2.1 द्वारा समूह का एक सरल उदाहरण है

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

जिसका अनुवाद है:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

0

EF 6.2 के साथ इसने मेरे लिए काम किया

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.