【问题标题】:LINQ to Entities does not recognize the method 'System.String ToString()' method MVC3LINQ to Entities 无法识别方法“System.String ToString()”方法 MVC3
【发布时间】:2013-07-13 16:28:42
【问题描述】:

Error Description:LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式。

执行以下代码时出现错误:

public ActionResult NewBooking()
    {
        var db = new VirtualTicketsDBEntities2();

        IEnumerable<SelectListItem> items = db.Attractions
          .Select(c => new SelectListItem
          {
              Value = c.A_ID.ToString(),
              Text = c.Name
          });
        ViewBag.CategoryID = items;
        return View();
    }

有什么摆脱这个错误的建议吗?

谢谢。

【问题讨论】:

标签: c# asp.net-mvc-3 visual-studio-2012


【解决方案1】:

您可以使用AsEnumerable() 将绑定上下文从 Linq-to-Entities 更改为 Linq-to-Objects:

IEnumerable<SelectListItem> items = db.Attractions
    .AsEnumerable()
    .Select(c => new SelectListItem
    {
        Value = c.A_ID.ToString(),
        Text = c.Name
    });

【讨论】:

  • 成功了。谢谢。我会在 9 分钟内将您的答案标记为正确。
  • 只使用AsEnumerable() ... ToList() 是一个代价高昂的步骤,具体取决于物品的数量。
  • 这看起来效率很低。如果表 Attractions 很大,我们填充一个大的元组列表,然后执行我们的查询。
  • @SimonBelanger 示例中没有过滤器,因此它不会提取比原始代码更多的记录。
  • @DStanley 为什么要投影到匿名类型? db.Attractions.AsEnumerable 将被强类型化为Attraction,然后你投射到你的SelectListItem,不需要匿名对象作为中间对象。唯一不同的是ToList 正在构建列表。查询仍将序列化为Attraction,然后序列化为SelectList,而无需创建List&lt;Attraction&gt;
【解决方案2】:

如果要对数据库进行转换,需要使用SqlFunction

public ActionResult NewBooking()
{
    var db = new VirtualTicketsDBEntities2();

    IEnumerable<SelectListItem> items = db.Attractions
      .Select(c => new SelectListItem
      {
          Value = SqlFunctions.StringConvert((double)c.A_ID)
          Text = c.Name
      });
    ViewBag.CategoryID = items;
    return View();
}

问题是SqlFunctions 不是标准的,可能不适用于所有数据库提供程序。如果这是个问题,请使用AsEnumerable 离开实体框架的可查询世界:

public ActionResult NewBooking()
{
    var db = new VirtualTicketsDBEntities2();

    IEnumerable<SelectListItem> items = db.Attractions.AsEnumerable()
      .Select(c => new SelectListItem
      {
          Value = c.A_ID.ToString()
          Text = c.Name
      });
    ViewBag.CategoryID = items;
    return View();
}

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多