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.
}

为了更好地澄清一点,我正在考虑成为一个字符串、整数或我想要搜索的任何类型。我希望的是我可以说 x.something 等于传入的变量。

我可以使用

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

我使用接口和抽象类的组合来实现这一点。

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 回答