2013-01-08 14 views
7

Ich möchte eine Liste einer bestimmten Entität, gruppiert nach einer bestimmten Eigenschaft, sortiert absteigend nach Zeitstempel und paginiert (mit Skip und Take). Was ich bekommen habe, ist dies:Eine Linq-Abfrage paginieren, die OrderBy verwendet

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); 

Bei der Ausführung habe ich die Ausnahme:

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

... Ich rief SortiertNach() (wenn auch absteigend) und ich nannte es vor Skip()! Was vermisse ich?

Antwort

7

Sie haben die Gruppen nicht bestellt; Sie müssen das tun, bevor Sie blättern können. Zum Beispiel:

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

(Sie auch OrderByDescending ersetzen können, wenn Sie die Gruppen in umgekehrter Reihenfolge wollen)

auch: da Sie die Gruppierung, die Reihenfolge, in den ursprünglichen Daten ist weitgehend bedeutungslos; Sie könnten wahrscheinlich die OrderByDescending(c => c.TimeStamp) entfernen.

So Nettoergebnis:

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); 

oder möglicherweise:

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

Vielen Dank für die Klärung der Erstausstellung und Realisierung Ich habe ein neues;) (nämlich ‚ich von Zeitpunkt zu bestellen haben, aber dies ist weitgehend nutzlos wegen Gruppiere nach) –

2

Es ist höchstwahrscheinlich wegen der GroupBy nach dem OrderByDescending.

Ich glaube, Sie können versuchen:

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);