7

まず始めましょう、これが可能かどうかはわかりません。私はジェネリックスを学んでおり、アプリにいくつかのリポジトリがあります。ジェネリック型を取り、それをすべてのリポジトリから継承できるものに変換するインターフェイスを作成しようとしています。さて、私の質問に移りましょう。

public interface IRepository<T>
{
    IEnumerable<T> FindAll();
    IEnumerable<T> FindById(int id);
    IEnumerable<T> FindBy<A>(A type);
}

ジェネリックを使用して何を見つけるかを決定することは可能ですか?

public IEnumerable<SomeClass> FindBy<A>(A type)
{
    return _context.Set<SomeClass>().Where(x => x. == type); // I was hoping to do x.type and it would use the same variable to search.
}

もう少し明確にするために、私は文字列、int、または検索したいタイプであると考えていました。私が望んでいるのは、何かが渡された変数と等しいx.somethingと言うことができるということです。

を使用して、任意のリポジトリをdbcontextに設定できます

public IDbSet<TEntity> Set<TEntity>() where TEntity : class
{
    return base.Set<TEntity>();
}

助言がありますか?

4

2 に答える 2

4

Expression<Func<T, bool>>このように代わりに使用する場合A

public interface IRepository<T>
{
    ... // other methods
    IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate);
}

linqを使用して型をクエリし、リポジトリクラスを呼び出すコードでクエリを指定できます。

public IEnumerable<SomeClass> FindBy(Expression<Func<SomeClass, bool>> predicate)
{
    return _context.Set<SomeClass>().Where(predicate);
}

そしてそれをこのように呼んでください:

var results = repository.FindBy(x => x.Name == "Foo");

また、これが汎用式であるため、各リポジトリに実装する必要はなく、汎用ベースリポジトリに実装できます。

public IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate)
{
    return _context.Set<T>().Where(predicate);
}
于 2012-12-19T13:46:07.930 に答える
0

これを正確に実現するために、InterfaceクラスとAbstractクラスを組み合わせて使用​​しています。

public class RepositoryEntityBase<T> : IRepositoryEntityBase<T>, IRepositoryEF<T> where T : BaseObject
 // 
public RepositoryEntityBase(DbContext context)
    {
        Context = context;
//etc

public interface IRepositoryEntityBase<T> : IRepositoryEvent where T : BaseObject //must be a model class we are exposing in a repository object

{
    OperationStatus Add(T entity);
    OperationStatus Remove(T entity);
    OperationStatus Change(T entity);
   //etc

その場合、派生クラスは、オブジェクト固有のメソッドをいくつか持つことも、実際には何も持たずに機能することもできます。

public class RepositoryModule : RepositoryEntityBase<Module>, IRepositoryModule{
    public RepositoryModule(DbContext context) : base(context, currentState) {}
}
//etc
于 2012-12-19T13:45:50.927 に答える