2013-01-08 9 views
7

特定のプロパティでグループ化された特定のエンティティのリストを、タイムスタンプで降順に並べ替えて(スキップとテイクを使用して)ページしたいとします。私は例外を持って実行されるとOrderByを使用する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

おかげで、私は新しいものを持って実現;)(すなわち、「私はタイムスタンプで注文する必要がありますが、これはのために大部分が役に立ちませんGroupBy) –

2

それは最もおそらくOrderByDescendingGroupByです。

私はあなたが試すことができると思う:オリジナル問題の明確化のため

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); 
関連する問題