SelectListItem在加载时崩溃

问题描述:

我试图将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. 

有什么建议吗?

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

您没有使用您在控制器中创建的ViewBag属性。

而是执行此操作:

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