2016-11-30 9 views
0

Это показывает ошибку, как «не содержит определения для ID» для кодаНе содержит определение для «Содержит»

[HttpPost] 
public ActionResult show(List<int> ids) 
    { 
     if (ids != null) 
     { 
      int[] brands = ids.ToArray(); 
      var brandId = _db.Brands.Where(p => brands.Contains(p.ID)); 
      var srtItems = _db.Products.Where(p => p.CategoryID == brandId.ID); 

      return PartialView("_pView", srtItems); 
     } 
    } 

и для следующего кода ошибки является не содержит определения для Содержит

[HttpPost] 
     public ActionResult show(List<int> ids) 
     { 
      if (ids != null) 
      { 
       int[] brands = ids.ToArray(); 
       var brandId = _db.Brands.Where(p => brands.Contains(p.ID)); 

       var sortItemss = _db.Products.Where(p => brandId.Contains(p.CategoryID)); 
       return PartialView("_pView", srtItems); 
      } 

Пожалуйста направьте меня

+0

@diiN_ Конечно, он сделал, иначе он не сможет использовать 'Где' – user3185569

ответ

4

Это где var становится корнем всех зол, как это скрывает реальный тип данных. Отбросьте вар, и вы сразу же заметите проблему:

int[] brands = ids.ToArray(); 
IQueryable<Brand> brandId = _db.Brands.Where(p => brands.Contains(p.ID)); 
IQueryable<Product> srtItems = _db.Products.Where(p => p.CategoryID == brandId.ID); 

brandId последовательность (когда материализованные), и это не единственный объект, поэтому он не содержит определение ID.

Чтобы решить, что вы можете:

IQueryable<int> brandIds = _db.Brands.Where(p=> brands.Contains(p.ID)).Select(b=> b.ID); 
IQueryable<Product> srtItems = _db.Products.Where(p=> brandIds.Contains(p.CategoryID)); 

Получить идентификаторы найденных записей, и матч от этих идентификаторов.

Как совет, не используйте var, если реальный тип не является избыточным (это означает, что показывает в других частях заявления)

+0

Плохой совет. Обе переменные 'var' заменяли реальный тип с' IQueryable 'на' IEnumerable '. –

+0

@IvanStoev Абсолютно корректно о второй части, но не о совете! Я сделал это в спешке, но если кто-то делает это намеренно, то это значит, что он не знает, что возвращает метод. Мы не должны использовать метод, который мы не знаем, его подпись, я думаю. В противном случае нам нужно полностью понять разницу между 'IQueryable' и' IEnumerable' и * What, которые выполняются где и когда * – user3185569

+0

@ user3185569, сэр вы можете объяснить, какая разница между IEnumerable и IQueryable. Я имею в виду, когда использовать каждый из них. – user777

Смежные вопросы