2016-11-30 154 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