5

私のベースリポジトリクラスで

この関数は、ソートされたデータコレクションをDBから取得できるようにするために作成しました。Tはクラスレベルで定義されたジェネリックです

public abstract class RepositoryBase<T> 
        where T : class

コードは次のとおりです。

public IList<T> GetAll<TKey>(Expression<Func<T, bool>> whereCondition, Expression<Func<T, TKey>> sortCondition, bool sortDesc = false)
        {
            if (sortDesc)
                return this.ObjectSet.Where(whereCondition).OrderByDescending(sortCondition).ToList<T>();

            return this.ObjectSet.Where(whereCondition).OrderBy(sortCondition).ToList<T>() ;
        }

私の目標は、次のように関数を呼び出すことができるように、汎用の並べ替えパラメーターを導入することでした。

repo.GetAll (model=>model.field>0, model=>model.sortableField, true)

つまり、匿名関数を介して直接ソートフィールドを指定できるため、Intellisenseを使用して...

残念ながら、この関数は、最後のコード行がコンパイル時にエラーを生成するため、機能しません。

私も電話をかけようとしました:

repo.GetAll<Model> (model=>model.field>0, model=>model.sortableField, true)

しかし、これは機能しません。

目標を達成するために関数をどのように書くべきですか?

私はEF5、c#、.NET4.5で作業しています

4

1 に答える 1

3

あなたはObjectSetwhich implementsを使用していますIQueryable<T>System.Linq.Queryableこれは、パラメーターを受け入れるon のメソッドによって拡張されExpression<Func<ます。Expressionローカルではなくデータベースで実行することを意図しているため、これらのパラメーターを使用するのは正しいことです。

  • Func は匿名デリゲートであり、.net メソッドです。
  • Expression はツリーであり、Func にコンパイルされるか、Sql などに変換されます。

メソッドの実際の使用法やコンパイラ エラーは示されませんでしたが、メソッドの実際の使用法は非常に抽象的なものでした。あなたが犯している可能性のあるエラーは、2 つの型パラメーターを混同していると思われます。

あなたが言った:

repo.GetAll<Model> (model=>model.field>0, model=>model.sortableField, true)

ただし、このメソッドのジェネリック パラメータは、sortableField のタイプを表します。sortableField がモデルでない場合 - これは間違っています。

代わりに、次のようにする必要があります。

Repository<Person> myRepo = new Repository<Person>();
myRepo.GetAll<DateTime>(p => p.Friends.Count() > 3, p => p.DateOfBirth, true);

並べ替えタイプを指定すると意図した使用パターンが崩れる場合は、IOrderer を使用してそのキーを非表示にすることを検討してください

于 2013-02-25T17:28:39.263 に答える