7

特定のプロパティでグループ化され、タイムスタンプの降順でページ付けされた(スキップとテイクを使用)特定のエンティティのリストを返したい。私が得たのはこれです:

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()を(降順ではありますが)呼び出し、Skip()の前に呼び出しました!私は何が欠けていますか?

4

2 に答える 2

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);
于 2013-01-08T11:31:51.357 に答える
2

おそらくGroupBy後のせいですOrderByDescending

私はあなたが試すことができると思います:

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);
于 2013-01-08T11:32:03.563 に答える