我是Entity Framework和LINQ的新手。我有以下代码,返回供应商列表
public class SupplierRepository
{
private DataContext db = new DataContext();
public IQueryable<Supplier> FindAllSupplier()
{
return db.Suppliers;
}
}
这很好用,但我知道你可以在Linq和EF中使用Generics。所以上面的代码看起来像这样...
public class GenericRepository
{
private DataContext db = new DataContext();
public IQueryable<T> FindAll<T>()
{
return ...
}
}
因此我可以使用它来返回我的EF模型中的任何类型,但我不确定如何实现它。有人可以提出建议吗?
答案 0 :(得分:3)
不是返回IQueryable<T>
而是让您的存储库实现IQueryable<T>
而不是将DataContext
包装在存储库中,而是将DataContext
和存储库包装在一个单元中工作。您的存储库可能看起来像这样:
public abstract class Repository<T> : IQueryable<T>
where T : class
{
private readonly IQueryable<T> query;
protected Repository(IQueryable<T> query)
{
this.query = query;
}
public Type ElementType
{
get { return this.query.ElementType; }
}
public Expression Expression
{
get { return this.query.Expression; }
}
public IQueryProvider Provider
{
get { return this.query.Provider; }
}
public abstract void InsertOnSubmit(T entity);
public abstract void DeleteOnSubmit(T entity);
...
}
我使用这种方法有效地隐藏抽象背后的O / RM,这允许我对我的应用程序进行单元测试,同时仍允许在我的存储库上使用LINQ并且具有工作单元模式。
您可以在此处阅读所有相关信息:Faking your LINQ provider。