我在存储库上运行查询时遇到问题。我必须按 id 获取产品并将其与产品图像一起显示在编辑视图中。
在我的ProductRepository中有一个实现Get()的方法,即获取所有产品和GetByID,顾名思义。我使用如下所示的工作单元类实现了通用存储库模式
public class GenericRepository<TEntity> where TEntity : class
{
internal SchoolContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SchoolContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
我认为这是唯一相关的代码块。当我尝试运行我在教程中找到的查询以使用下面的查询获取产品以及图像时,就会出现问题
Product product = db.Products.Include(s => s.Files).SingleOrDefault(s => s.ID == id);
我不能使用数据库。产品,因为我使用的是工作单元类,所以我必须使用_unit.ProductRepository.GetByID().Include(s => s.Files).SingleOrDefault(s => s.ID == id);
运行查询
然而,这似乎是不可能的,我被困住了。
一起使用,它仅适用于 IQueryable,当您在存储库中调用查询query.ToList();
查询从数据库检索到 IEnumerable 中的内存时,并且当您的数据在内存中时,包含不起作用。
可以将要包含在查询中的对象作为参数传递,就像在 Get 方法中使用筛选器或顺序一样。
您可以覆盖产品存储库方法
public override Product GetByID(object ID)
{
return db.Products.Include(p => p.Files).SingleOrDefault(p => p.ID == ID);
}
或者如果您不想总是返回文件
public override Product GetByID(object ID, List<string> includes)
{
var query = db.Products.AsQueryable();
foreach (string include in includes)
{
query = query.Include(include);
}
return query.SingleOrDefault(p => p.ID == ID);
}
并像
Product product = new ProductRepository().GetByID(IDProduct, new List<string>() { "Files" });
试试这个:
DbSet<TEntity> set = dbSet;
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
set = set.Include(includeProperty);
}
IQueryable<TEntity> query = set;
if (filter != null)
{
query = query.Where(filter);
}