0

リポジトリ内の ID でオブジェクトをプルする一般的な方法を考え出そうとしています。私のデータベースでは、通常、すべての ID は主キーであり、整数型です。将来的にはそうではない場合もあるかもしれませんが、それでもすべてのオブジェクトに対して同じメソッドを維持したいと考えています。これが私のインターフェイスの外観です。

public interface IRepository<TE>
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }

リフレクションを使用してオブジェクトのIDを取得し、その特定のオブジェクトのすべてのオブジェクトを解析するコードを見てきました(理想的ではありません)。私はまた、このようなものを見てきました:

TE GetById(Expression<Func<TE, bool>> predicate);

私はここからそのアイデアを得ました。

私はまだ表現に慣れていないので、これがうまくいくかどうかわかりません。次の表現を含めることができるので、そうなると思います。

var foo = GetById(f => f.Id == 1);

しかし、それは実際には GetById ではなく、任意の式を使用して必要なものを取得できると思いますよね?

どんな考えも高く評価されます。

4

3 に答える 3

2

まず、なぜ aRepository<TE,TC>ではなく a なのRepository<T>ですか?

私は2つの方法を使用します:

 TE GetById(int id){`
     return _querySource.Single(x=>x.Id ==1);
 }

 IQueryable<TE> Query(Expression<Func<TE,bool>> predicate){
    return _querySource.Where(predicate);
 }

IQueryable<TE>(基礎となるフィールドがあり、この例で名前を付けたと仮定しています_querySource。)

于 2011-03-12T14:00:13.593 に答える
2

私は一般的に持っているだけです:

public interface IRepository<T>
{
    ...
    T Load(object id);
}

すべての主キーに同じ型 ( ) を使用することを標準化することをお勧めしintますが、それが不可能な場合objectは、2 番目のジェネリック パラメーターの追加の複雑さを使用して回避します。

于 2011-03-12T14:46:38.490 に答える
-1

TE は汎用クラスであるため、それはできません。

[Id] というプロパティを持つインターフェイスを実装するには、この TE ジェネリックを制限する必要があります。

interface MainInterface
{
    Int ID{get;}
}

and in Reporsitory  :
public interface IRepository<TE, TC>  : where TE is MainInterface
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }
于 2011-03-12T14:05:59.883 に答える