2013-04-29 7 views
22

से मैं इस तरह एक मेज है (तालिका नाम: पोस्ट):इकाई की रूपरेखा प्रत्येक समूह से एक का चयन तारीख

+----+--------------------------+-------+------------+ 
| id |   content   | type | date | 
+----+--------------------------+-------+------------+ 
| 0 | Some text    | TypeA | 2013-04-01 | 
| 1 | Some older text   | TypeA | 2012-03-01 | 
| 2 | Some even older texttext | TypeA | 2011-01-01 | 
| 3 | A dog     | TypeB | 2013-04-01 | 
| 4 | And older dog   | TypeB | 2012-03-01 | 
| 5 | An even older dog  | TypeB | 2011-01-01 | 
+----+--------------------------+-------+------------+ 

एक LINQ अभिव्यक्ति मैं प्रत्येक प्रकार के नवीनतम सामग्री खोजने के लिए चाहते हैं का उपयोग करना है, तो परिणाम

Some text | TypeA 
A dog  | TypeB 

मैंने कुछ चीजों की कोशिश की है लेकिन गैर-कार्यशील अभिव्यक्तियों को इंगित करने में कोई बात नहीं है।

उत्तर

50

पर मैप कर सकते हैं यदि आप पूरे पोस्ट प्राप्त करना चाहते हैं। आप इस कोशिश कर सकते हैं:

var query = Posts.GroupBy(p => p.Type) 
        .Select(g => g.OrderByDescending(p => p.Date) 
           .FirstOrDefault() 
        ) 
+0

क्या समूह क्वेरी चलाने से पहले या बाद में चलाया जाता है? तो क्या यह प्रत्येक पंक्ति को डीबी से खींच देगा, फिर उन्हें समूहित करेगा या क्या यह क्वेरी में कथन द्वारा समूह जोड़ देगा ताकि केवल समूहीकृत पंक्तियों को खींच सके? – Samir

+0

@ सैमिर: यह वास्तव में वास्तव में एक अच्छा मुद्दा है। ऐसा लगता है कि ईएफ पर संस्करण के आधार पर अलग-अलग व्यवहार हैं। ईएफ 7 क्लाइंट को डेटा लोड करने लगता है और वहां समूहबद्ध करता है: https://stackoverflow.com/questions/11564311/sql-to-entity-framework-count-group-by। लगता है कि ईएफ कोर में एसक्यूएल समूह के लिए समर्थन है: https://github.com/aspnet/EntityFrameworkCore/pull/9872। इसकी पुष्टि करने के लिए, आप वास्तविक एसक्यूएल क्वेरी देखने के लिए एक प्रोफाइलर का उपयोग कर सकते हैं। –

+0

@ सैमिर: यदि आप ईएफ कोर नवीनतम संस्करण का उपयोग कर रहे हैं और प्रदर्शन स्वीकार्य है, तो आप इस समाधान पर विचार कर सकते हैं भले ही एसक्यूएल क्वेरी समूह का उपयोग न करे (किसी फ़ंक्शन में कोड को लपेटें ताकि हम आवश्यक होने पर बाद में रिफैक्टर कर सकें) ऐसा लगता है कि लोगों ने इसे ध्यान में रखा है और बाद में रिलीज इस का समर्थन कर सकते हैं। अन्यथा, आपको कच्ची एसक्यूएल क्वेरी लिखनी है। –

2

मुझे लगता है आप समूह प्रकार के आधार पर आपके पोस्ट पंक्तियों और फिर उस प्रकार

from row in Posts 
group row by row.type 
into g 
select new 
{  
    Content = (from row2 in g orderby row2.date descending select row2.content).FirstOrDefault(), 
    Type = g.Key 
} 
+0

यह काम कर रहा है (जोड़ने के बाद एक "," और FirstOrDefault() करने के लिए पहले से बदल रहा वहाँ एक रास्ता पूरी पोस्ट प्राप्त करने के लिए है, या मैं इसे का निर्माण करने की आवश्यकता है। "नया चुनें"? – Todilo

+1

@ टोडिलो मैं मॉडल के बिना इसका परीक्षण नहीं कर सकता, इसलिए गलतियों के लिए खेद है :) आप वापसी 2 को पंक्ति 2.content से row2 में बदलकर पोस्ट प्राप्त कर सकते हैं, लेकिन समूह द्वारा वेश्या है, क्योंकि आपको नवीनतम की आवश्यकता है "प्रत्येक प्रकार" की सामग्री। आप अलग-अलग प्रकार प्राप्त करने का भी प्रयास कर सकते हैं, और फिर foreach प्रकार दिनांक के अनुसार आदेश दिया गया शीर्ष 1 पोस्ट का चयन करें, मुझे लगता है कि यह क्वेरी अधिक कुशल – Alex

+0

दिखाई देगी। मैं फिर से मॉडल को मैन्युअल रूप से बनाया गया, यह ऐसा करने का सबसे प्रभावी तरीका प्रतीत होता है। आपका बहुत बहुत धन्यवाद! – Todilo

1

या की तारीख संग्रह द्वारा आदेश दिया उतरते अस्थायी परिणाम का उपयोग करने से पहले सामग्री का चयन कर सकते हैं और विधेय

var tmp = posts.GroupBy(x => x.type).Select(x => new {x.Key, date = x.Max(g => g.date)).ToArray(); 

var filter = PredicateBuilder.False<Post>(); 

foreach (var item in tmp) 
{ 
    filter = filter.Or(x => x.type == item.Key && x.date == item.date); 
} 

var newestPosts = posts.Where(filter); 
+0

जैसा उपरोक्त उदाहरण काम करता है मैंने इसका परीक्षण नहीं किया है। पहले PredicateBuilder नहीं देखा है, लेकिन एक शांत सुविधा की तरह लगता है मुझे सीखना चाहिए। धन्यवाद। – Todilo

0

स्मृति से , ऐसा कुछ ऐसा करना चाहिए

var data = context.Posts.Group(p => p.Type) 
         .Select(g => new { 
              Type = g.Key, 
              Date = g.OrderByDescending(p => p.Date) 
                .FirstOrDefault() 
             } 

यह जीआई होगा क्या आप एक नया अनाम प्रकार है, लेकिन आप इसे हमेशा

+0

आपका मतलब समूहबी (...) –

संबंधित मुद्दे