2013-02-08 98 views
2

我試圖將selectList插入到視圖(表單)中。我想我會通過在控制器中填充列表並將其作爲視圖包發送到視圖來完成此操作。這裏就是我有這麼遠:SelectListItem在加載時崩潰

var query = from p in db.ProductCategories 
         join pt in db.ProductCategoriesTranslations on p.ProductCategoriesId equals pt.ProductCategoriesId 
         where pt.ProductLanguage.Equals("se") 
         orderby pt.ProductCategoriesName 
         select new SelectListItem 
         { 
          Value = p.ProductCategoriesId.ToString(), 
          Text = pt.ProductCategoriesName 
         }; 

      ViewBag.ProductCategoriesId = query; 
      return View();  

然後在視圖中我有:

@Html.DropDownList("ProductCategoriesId", String.Empty) 

我認爲這是簡單而直接的,但是當我加載它與下面的錯誤崩潰的事情:

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression. 

有什麼建議嗎?

回答

0

LINQ到SQL無法翻譯ToString()任何SQL命令。這是可以理解的。在將它們轉換爲SelectListItems(或避免ToString()調用)之前,應執行查詢。例如。

var query = from p in db.ProductCategories 
         join pt in db.ProductCategoriesTranslations on p.ProductCategoriesId equals pt.ProductCategoriesId 
         where pt.ProductLanguage.Equals("se") 
         orderby pt.ProductCategoriesName; 
         select new { Id = p.ProductCategoriesId, Name = pt.ProductCategoriesName }; 

ViewBag.ProductCategoriesId = query.ToList().Select(p =>   
         new SelectListItem 
         { 
          Value = p.Id.ToString(), 
          Text = p.Name 
         }); 

請注意,當您調用query.ToList()時,Linq2Sql會計算表達式。在此之前,沒有SQL運行。

另一個問題在Leniel Macaferi的回答中描述。

更新

becase的目標技術改變(問題標記),因爲我答案,我可以建議你採用不同的方法太:

您可以在LINQ查詢中使用SqlFunctions.StringConvert代替ToString和EF能翻譯。

+0

謝謝,這個工作,但它的工作沒有在視圖中的更正,所以這段代碼工作,即使它不應該? '@ H​​tml.DropDownList(「ProductCategoriesId」,string.Empty)' – Dennis 2013-02-08 13:24:35

+1

它可能在默認情況下使用ViewBag。我不知道這是因爲我總是使用ViewModels來處理我的視圖。 – 2013-02-08 13:30:29

+0

我早先嚐試了SqlFunctions.StringConvert,但又得到了另一個錯誤信息。我想這主要是我不知道如何正確實施它。通過您提供的解決方案使用它還有一些優勢嗎? – Dennis 2013-02-09 08:31:35

0

您沒有使用您在控制器中創建的ViewBag屬性。

而是執行此操作:

@Html.DropDownList("ProductCategoriesId", 
        ViewBag.ProductCategoriesId as SelectList, 
        string.Empty)