我如何制作。包含在IEnumerable

时间:2015-06-16 16:09:51

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

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

我无法使用db.Products,因为我使用的是工作单元,所以我必须使用_unit.ProductRepository.GetByID().Include(s => s.Files).SingleOrDefault(s => s.ID == id);运行查询

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

2 个答案:

答案 0 :(得分:2)

你不能将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" });

答案 1 :(得分:0)

试试这个:

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