2013-01-08 12 views
7

का उपयोग करने वाली एक linq क्वेरी को पगिन करना मैं एक निश्चित संपत्ति द्वारा समूहित एक निश्चित इकाई की एक सूची वापस करना चाहता हूं, टाइमस्टैम्प और पेजिनेटेड (छोड़कर और टेक का उपयोग करके) द्वारा क्रमबद्ध आदेश। क्या मुझे मिल गया यह है:ऑर्डरबी

container.CoinMessageSet.Where(
       c => c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode.Equals("opcode") || 
         c.RecipientOperator.OperatorCode.Equals("opcode")) 
       ).OrderByDescending(c => c.TimeStamp) 
       .GroupBy(c => c.Reference).Skip(x).Take(100); 

निष्पादन पर मैं अपवाद है:

The method 'Skip' is only supported for sorted input in LINQ to Entities. 
The method 'OrderBy' must be called before the method 'Skip'. 

... मैं OrderBy (कहा जाता है) (अवरोही यद्यपि) और मैं छोड़ें पहले यह कहा जाता है()! मैं क्या खो रहा हूँ?

उत्तर

7

आपने समूहों का आदेश नहीं दिया है; पेज से पहले आपको ऐसा करने की ज़रूरत है। उदाहरण के लिए:

.GroupBy(c => c.Reference).OrderBy(grp => grp.Key).Skip(x).Take(100); 

(आप भी OrderByDescending स्थानापन्न कर सकते हैं अगर आप उलटे क्रम में समूहों चाहते हैं)

इसके अलावा: जब से तुम समूहीकरण कर रहे हैं, मूल डेटा में आदेश काफी हद तक व्यर्थ है; आप शायद OrderByDescending(c => c.TimeStamp) हटा सकते हैं।

तो शुद्ध परिणाम:

var query = container.CoinMessageSet.Where(
      c => c.MessageState != MessageStateType.Closed && 
       (c.DonorOperator.OperatorCode.Equals("opcode") || 
        c.RecipientOperator.OperatorCode.Equals("opcode")) 
      ).GroupBy(c => c.Reference).OrderBy(grp => grp.Key) 
      .Skip(x).Take(100); 

या संभवतः:

var query = (from c in container.CoinMessageSet 
      where c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode == "opcode" || 
        c.RecipientOperator.OperatorCode == "opcode") 
      group c by c.Reference into grp 
      orderby grp.Key 
      select grp).Skip(x).Take(100); 
+0

धन्यवाद, और साकार मैं एक नया एक है;) (अर्थात् 'मैं टाइमस्टैम्प द्वारा ऑर्डर करने के लिए है, लेकिन यह काफी हद तक के कारण बेकार है समूह द्वारा) –

2

यह GroupByOrderByDescending के बाद की वजह से सबसे शायद है।

मुझे लगता है कि आप की कोशिश कर सकते हैं: मूल मुद्दे पर स्पष्टीकरण के लिए

container.CoinMessageSet.Where(
       c => c.MessageState != MessageStateType.Closed && 
        (c.DonorOperator.OperatorCode.Equals("opcode") || 
         c.RecipientOperator.OperatorCode.Equals("opcode")) 
       ).OrderByDescending(c => c.TimeStamp) 
       .GroupBy(c => c.Reference).OrderByDescending(c = > c.Key).Skip(x).Take(100); 
संबंधित मुद्दे