gpt4 book ai didi

c# - 我如何使 .Include 在 IEnumerable 上工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:53 25 4
gpt4 key购买 nike

我在对我的存储库运行查询时遇到问题。我必须通过 ID 获取产品并将其显示在产品图像旁边的编辑 View 中。

我的 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);

我不能使用 db.Products,因为我使用的是工作类单元,所以我必须使用 _unit.ProductRepository.GetByID().Include(s => s.Files).SingleOrDefault( s => s.ID == id);

然而这似乎是不可能的,我被困住了。

最佳答案

您不能将 Include 与 IEnumerable 一起使用,它仅适用于 IQueryable,当您在存储库 query.ToList(); 中调用时,您的查询在 IEnumerable 中从数据库检索到内存,并且当您的数据在内存中包含不起作用。

您可以将要包含在查询中的对象作为参数传递,就像您在 Get 方法中使用过滤器或顺序一样。

您可以重写您的 ProductRepository 方法

    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" });

关于c# - 我如何使 .Include 在 IEnumerable 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30872837/

25 4 0