2016-11-30 139 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_肯定他,否则他将无法使用'Where' – user3185569

回答

4

这是var成为所有罪恶的根源,因为它隐藏了真实的数据类型。删除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)); 

获取的检索的记录由这些ID的ID,并匹配。

作为一个咨询,不要使用var除非数据类型是多余的(这意味着它在声明中表示的其他部分)

+0

不好的建议。您的'var''替代品“将实际类型从'IQueryable '更改为'IEnumerable '。 –

+0

@IvanStoev关于第二部分绝对正确,但不包括建议!我很快就做到了,但如果有人故意这样做,那就意味着他不知道该方法会返回什么结果。我们不应该使用一种我们不知道其签名的方法。否则,我们需要充分理解'IQueryable'和'IEnumerable'之间的区别以及*执行什么地点和时间* – user3185569

+0

@ user3185569,请问您可以解释一下IEnumerable和IQueryable之间的区别。我的意思是什么时候使用他们每个人。 – user777