クエリ文字列またはルート データ パラメーターを解析し、そのパラメーターに基づいて特定のクエリ可能なものをフィルター処理する手間を省く汎用拡張メソッドを作成しました。
public static IQueryable VaryBy<T>(this IQueryable<T> input,Func<T,int> navigationalproperty,string routeparameter,PageController currentPagecontroller) where T : EntityObject
{
string navid = currentPagecontroller.GetFromRequestOrRouteData(routeparameter);
if (!String.IsNullOrEmpty(navid))
{
int navidasint = int.Parse(navid);
//return input.Where(x => navigationalproperty(x) == navidasint);
return (from var in input
let result = navigationalproperty(var)
where result == navidasint
select var);
}
else
{
return input;
}
}
this を使用すると、上記のブロックの非汎用バージョンを毎回コピーして貼り付ける代わりに、コントローラーに次のクリーンなコード行を記述できます。
return aDB.GetAll<Product>().VaryBy(x=> x.Category.Id, "categoryid", this);
悲しいことに、結果に対して ToList() を呼び出すと、例外がスローされます。「LINQ 式ノード タイプ 'Invoke' は、LINQ to Entities ではサポートされていません。
なぜこれが起こっているのか、なんとなくわかります。これにはLinqKitの AsExpandable を使用できるかもしれないとも読みましたが、自分でこれを機能させる方法を理解する前に、彼らの「自動ソリューション」を使用するのをためらっています。アプローチも、ここで学ぼうとしているだけです!