LINQ to Entities仅支持转换实体数据模型基元类型?

Ber*_*ker 11 c# linq asp.net-mvc entity-framework asp.net-mvc-3

我正在尝试在我的视图中填充下拉列表.任何帮助是极大的赞赏.谢谢.

错误:

无法将类型"System.Int32"强制转换为"System.Object"类型.

LINQ to Entities仅支持转换实体数据模型基元类型.

控制器:

ViewBag.category = (from c in new IntraEntities().CategoryItems
                   select new SelectListItem() {Text=c.Name, Value=""+c.ID }).ToList<SelectListItem>();
Run Code Online (Sandbox Code Playgroud)

视图:

Category:<br />@Html.DropDownList("category", (List<SelectListItem>)ViewBag.category)
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 20

这个怎么样:

ViewBag.category = 
    from c in new IntraEntities().CategoryItems.ToList()
    select new SelectListItem 
    {
        Text = c.Name, 
        Value = c.ID.ToString() 
    };
Run Code Online (Sandbox Code Playgroud)

以及如何使用强类型视图模型而不是ViewBag的一些弱类型的废话(这是我称之为的方式)?

像这样:

public class CategoryViewModel
{
    public string CategoryId { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public ActionResult Foo()
{
    var model = new CategoryViewModel
    {
        Categories = 
            from c in new IntraEntities().CategoryItems.ToList()
            select new SelectListItem 
            {
                Text = c.Name, 
                Value = c.ID.ToString() 
            }
    };
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

最后在你的强类型视图中:

@model CategoryViewModel
@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.CategoryId, Model.Categories)
    <button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)

好多了,你不觉得吗?

  • @olivehour,不,我不需要更多声望.我只是想看到人们停止使用ViewBag的这个废话并开始在他们的ASP.NET MVC应用程序中使用视图模型. (10认同)
  • @olivehour,不,不要给他们链接到那个页面.我的意思是这个网页中的例子远非您在实际应用程序中应该做的任何事情.我的意思是在这个例子中,OP是硬编码LINQ到实体或者你在控制器中直接称之为DAL而不使用抽象并且使这个代码完全不可能单独进行单元测试.绝对不应该让您的控制器与特定的数据访问技术(如EF等)紧密相关.您应该使用抽象来削弱应用程序的不同层之间的耦合. (3认同)

Zia*_*iad 5

您可以在转换之前将查询强制转换为.AsEnumerable(),以强制其使用Linq to Objects进行强制转换,但最好使用System.Data.Objects.SqlClient.SqlFunctions中可用的SQL兼容函数,如下所示:

(from c in new IntraEntities().CategoryItems
select new SelectListItem() { 
    Text = c.Name, 
    Value = SqlFunctions.StringConvert((double)c.ID).TrimStart() 
})
Run Code Online (Sandbox Code Playgroud)

  • 这是我更可接受的答案。接受的答案只是在集合上调用ToList(),这可能不是必需的。然后,它脱离了轨道,并讲授有关viewmodel类的用法。 (5认同)