SelectListItem在加载时崩溃

时间:2013-02-08 13:01:25

标签: asp.net-mvc-3 entity-framework

我正在尝试将selectList插入视图(表单)。我想我会通过填充控制器中的列表并将其作为viewbag发送到视图来实现。这是我到目前为止所得到的:

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.

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

请改为:

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

答案 1 :(得分:0)

Linq to SQL无法将ToString()转换为任何SQL命令。这是可以理解的。您应该在将查询转换为SelectListItems之前执行查询(或避免ToString()调用)。 E.g。

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的回答中有描述。

<强>更新

由于我的回答我可以建议你采用不同的方法,因此改变了目标技术(问号):

您可以在LINQ查询中使用SqlFunctions.StringConvert代替ToString,EF可以翻译它。