動作: 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 を混在させてはいけない理由