0

クエリ文字列またはルート データ パラメーターを解析し、そのパラメーターに基づいて特定のクエリ可能なものをフィルター処理する手間を省く汎用拡張メソッドを作成しました。

  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 を使用できるかもしれないとも読みましたが、自分でこれを機能させる方法を理解する前に、彼らの「自動ソリューション」を使用するのをためらっています。アプローチも、ここで学ぼうとしているだけです!

4

2 に答える 2

0

経験則として、この要求を TSQL に変換する方法を考えてみてください。それをネイティブ TSQL に変換できない場合は、ほとんどの場合、どのフレームワークでも変換できません。If 句と外部メソッドの呼び出しはどちらも、これを 1 つのクエリに変換することを妨げます。

于 2012-08-31T13:59:19.213 に答える
0

これを単純化した私の質問に対するJohn Skeet回答のおかげで、次のような VaryBy 関数の作成に成功しました。

public static IQueryable VaryBy<T>(this IQueryable<T> input,Expression<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);
            Expression equals = Expression.Equal(navigationalproperty.Body, Expression.Constant(navidasint));
            return input.Where(Expression.Lambda<Func<T, bool>>(equals, navigationalproperty.Parameters));

        }
        else
        {
            return input;
        }
    }
于 2012-09-04T08:08:33.560 に答える