尝试在实体框架中使用泛型
首先,我不确定这是否可能。 我正在学习泛型,并在我的应用程序中有几个存储库。 我试图制作一个采用泛型类型的接口并将其转换为所有存储库都可以继承的接口。 现在到我的问题。
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.some东西等于传入的变量。
我可以设置任何存储库到我的dbcontext使用
public IDbSet<TEntity> Set<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
有什么建议么?
如果您使用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);
}
我使用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
链接地址: http://www.djcxy.com/p/67477.html