LINQ to Entities エンティティのリポジトリを生成するために T4 を使用しています。
リポジトリには、(特に) ページングに適した List メソッドが含まれています。サポートされているメソッドとサポートされていないメソッドのドキュメントには記載されていませんがSkip
、 unordered で「呼び出す」ことはできませんIQueryable
。次の例外が発生します。
System.NotSupportedException: メソッド 'Skip' は、LINQ to Entities の並べ替えられた入力に対してのみサポートされています。メソッド「OrderBy」は、メソッド「Skip」の前に呼び出す必要があります。
部分メソッドを介してデフォルトの並べ替えを定義できるようにすることで解決しました。しかし、式ツリーに実際にOrderBy
.
問題を可能な限り少ないコードに減らしました。
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = new NorthwindEntities();
return ent.Categories;
}
private Boolean IsSorted(IQueryable<Category> query)
{
return query is IOrderedQueryable<Category>;
}
}
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery)
{
currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")); // no sorting..
}
}
これは私の実際の実装ではありません!
しかし、私の質問は、どのようにIsSorted
メソッドを実装できるでしょうか? 問題は、LINQ to Entities クエリが常にObjectQuery
を実装するタイプであるということIOrderedQueryable
です。
OrderBy
では、メソッドが式ツリーに存在することを確認するにはどうすればよいでしょうか? ツリーを解析する唯一のオプションはありますか?
更新リポジトリに並べ替えサポートを追加する方法ではなく、部分メソッドが実際に式ツリーに追加
したかどうかを確認する方法であることを明確にするために、他の 2 つのオーバーロードを追加しました。ProvideDefaultSorting
OrderBy
問題は、最初の部分クラスがテンプレートによって生成され、部分クラスの 2 番目の部分の実装が別の時点でチーム メンバーによって行われることです。.NET Entity Framework が EntityContext を生成する方法と比較できます。これにより、他の開発者向けの拡張ポイントが可能になります。ProvideDefaultSorting
そのため、が正しく実装されていない場合でも、堅牢にしてクラッシュしないようにしたいと考えています。
問題はそれ以上かもしれませんが、ProvideDefaultSorting
実際に式ツリーに並べ替えが追加されたことを確認するにはどうすればよいでしょうか。
更新 2
新しい質問が回答され、受け入れられました。タイトルを質問にもっと一致するように変更する必要があると思います。それとも、同じ問題を抱えている人をこの解決策に導くので、現在のタイトルを残す必要がありますか?