2015-06-16 2 views
2

У меня возникли проблемы с запуском запроса в моем репозитории. Я должен получить продукт по id и отобразить его в виде редактирования вместе с изображением продукта.Как сделать. Включить для работы с IEnumerable

В моем ProductRepository есть метод, который реализует Get() i.e извлекает весь продукт и 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);

Однако это не представляется возможным, и я застрял.

+1

Учитывая, что у вас есть «включить свойства», вы просто не хотите «Get (includeProperties:« Files »)'? –

+0

Вы имеете в виду 'Get()', а не 'GetByID()' в вашей последней части кода? Поскольку 'GetByID()' всегда должен иметь переданный ему параметр. –

+0

Вся цель созданного вами репозитория - не допустить, чтобы потребитель мог использовать LINQ. Цель * состоит в том, чтобы помешать вам выполнять какую-либо операцию, но ограниченный набор функций. Таким образом, ваши варианты становятся довольно очевидными, либо не используют его, либо используют ограниченную функциональность, доступную вам, либо расширяют этот тип, чтобы поддерживать функциональные возможности, которые вы хотите, в рамках ограниченного подмножества LINQ, который он поддерживает. – Servy

ответ

2

Вы не можете использовать Include с IEnumerable, он работает только с IQueryable, когда вы вызываете в своем репозитории query.ToList();, ваш запрос извлекается из базы данных в память в IEnumerable и когда ваши данные хранятся в памяти. Include не работает.

Вы можете передать объекты, которые вы хотите включить в свой запрос, в качестве параметра, например, с фильтром или заказом в методе 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" }); 
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); 
} 
Смежные вопросы