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

标签 c# asp.net-mvc linq entity-framework repository-pattern

我在对我的存储库运行查询时遇到问题。我必须通过 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/

相关文章:

asp.net - 如何让 MVCSiteMap 将所有自定义生成的页面包含在 sitemap.xml 中

c# - 同步调用异步方法

asp.net-mvc - 我的 Godaddy 托管上的 MVC 4 ConnectionString 错误 166

c# - mvc 6 中下拉列表的 TagHelpers onchange 事件

asp.net-mvc - 使用 Ajax.BeginForm 显示验证摘要

c# - 我如何在 C# 的 Entity Framework 中使用 where 子句编写 SQL 更新查询

c# - LINQ查询中的竞赛条件

asp.net-mvc - 如何创建这个 lambda 表达式?

c# - Xamarin - 如何在不使用其他服务的情况下发送推送通知

c# - StructureMap 无法识别 TheCallingAssembly