1

動作: UI はエンティティ SQLソート式を jqGrid から DAL に送信し、サービス レイヤーに返される Where 句をいくつか適用します。私のサービス層は、Skip()..Take() を IQueryable に適用する PaginatedList オブジェクトを作成します。例:

var qry = ((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery<TEntity>(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL()); 
//GetEntitySQL() i.e. "it.WorksheetID ASC"
return qry.Where(p=> pStatus == "blah").Skip(5).Take(10);

機能しません: GroupBy() を適用してから Select() を適用すると、同じタイプのエンティティ (ワークシート) のリストが返されます。例:

var qry = ((IObjectContextAdapter)DbContext).ObjectContext
.CreateQuery<TEntity>(entityName)
.OrderBy(pEntitySQLSort.GetEntitySQL());

var qryGrouped = qry.GroupBy(pWorksheet => pWorksheet.ParticipantID)
.Select(pGroup => new {Group = pGroup, LatestWorksheetID = pGroup.Max(pWorksheet => pWorksheet.WorksheetID)})
.Select(p => p.Group.FirstOrDefault(pWorksheet => pWorksheet.WorksheetID == p.LatestWorksheetID)); 

return qryGrouped.Skip(5).Take(10); //throws exception.

NotSupportedException がスローされます: メソッド 'Skip' は、LINQ to Entities の並べ替えられた入力に対してのみサポートされます。メソッド「OrderBy」は、メソッド「Skip」の前に呼び出す必要があります。

最初のスニペットは esql ソート式を適用する IOrderedQueryable を返すようですが、2 番目のスニペットはそうではありませんか? または、 GroupBy() はクエリ/コレクションの順序を削除しますか? これが事実であり、LINQ をエンティティに適用する前に esql を適用する必要があるため、SQL ソート + LINQ GroupBy をどのように達成できますか?

関連:
ObjectQuery が実際に IOrderedQueryable になるのはいつですか?
ESQL と LINQ TO Entities を混在させてはいけない理由

4

1 に答える 1

1

GroupBy()を返しますIGrouping<int, Worksheet>。実際のオブジェクトは としてObjectQuery返されIQueryableます。あなたは私の質問にリンクしました (いつ ObjectQuery が本当に IOrderedQueryable ですか?)、これObjectQueryも実装しているという事実は、実際IOrderedQueryableにそのように動作することを必ずしも意味しないことを知っています。

より基本的な、関連する質問で、Jon Skeet は実際の型とコンパイル時の型を区別しました。コンパイル時の型 ( IQueryable) が重​​要です。

したがって、GroupBy効果的に前のOrderBy. 同様のケースでの簡単なテストでは、グループ化で順序付けさえなくなっていることがわかりました。結論: を正常に実行するOrderByには、を再適用する必要があります。Skip

于 2012-03-12T20:38:10.087 に答える