【问题标题】:LINQ to Entities does not recognize the method 'System.String ToString()' method in MVC 4LINQ to Entities 无法识别 MVC 4 中的“System.String ToString()”方法
【发布时间】:2013-08-16 12:13:52
【问题描述】:

我正在使用 MVC 4,我必须使用 Code First 迁移更新我的数据库。我要做的是从数据库表中选择记录,并将它们插入到用户可以选择的下拉列表中。

我有一个我不明白的错误:

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

控制器:

  public ActionResult Addnew()
        {
            var dba = new DefaultConnection();
            var query = dba.blob.Select(c => new SelectListItem
            {
                Value = c.id.ToString(),
                Text = c.name_company,
                Selected = c.id.Equals(3)
            });
            var model = new Companylist
            {
                xpto = query.AsEnumerable()
            };

            return View(model);
        }

【问题讨论】:

  • this answer 应该可以解决问题
  • 或者直接使用 LinqToObjects。
  • 解决了!!非常感谢

标签: c# asp.net asp.net-mvc asp.net-mvc-4 entity-framework-migrations


【解决方案1】:

您收到此错误是因为 Entity Framework 不知道如何在 sql 中执行 .ToString() 方法。所以你应该使用ToList加载数据,然后转换成SelectListItem:

var query = dba.blob.ToList().Select(c => new SelectListItem
    {
    Value = c.id.ToString(),
    Text = c.name_company,
    Selected = c.id.Equals(3)
});

编辑:为了更清楚起见,实体框架将您对查询运算符(例如SelectWhere ETC)的使用转换为 sql 查询以加载数据。如果你调用像ToString() 这样的方法,而Entity Framework 在sql 中没有对应的方法,它会报错。所以想法是在数据加载后推迟使用此类功能。 ToList, ToArray ETC 强制执行查询从而加载数据。加载数据后,任何进一步的操作(例如SelectWhere ETC)都会使用 Linq to Objects 对内存中的数据执行。

【讨论】:

  • 这种方法的主要问题是,如果您从包含数千或数万条记录的表中进行选择怎么办?另一个选择。效率极低 - 最好使用 SqlFunctions:Value = SqlFunctions.StringConvert(c.id)
  • VarunK 和 NaytGrochowski 的精彩解释
【解决方案2】:

如果……你使用:

Value = c.id + "",

而不是

Value = c.id.ToString(),

编辑

使用此选项,您不会从数据库中检索所有数据

【讨论】:

    【解决方案3】:

    只需使用委托:

    var query = dba.blob.Select(delegate(blob c)
    {
        return new SelectListItem
            {
                Value = c.id.ToString(),
                Text = c.name_company,
                Selected = c.id.Equals(3)
            };
    });
    

    【讨论】:

      【解决方案4】:

      以下是我如何将其显示为 SelectList。

       public List<BlobEntity> GetBlobs()
          {
              List<BlobEntity> blobs = null;
              using (var db = new MyDBEntities())
              {
                  blobs = (from b in db.blobs
                           where b.id > 0 //Example filter
                           select new BlobEntity
                           {
                               ID = b.id,
                               CompanyName = b.name_company
                           }
                           ).ToList();
      
              }
              return blobs;
          }
      
         public static SelectList GetBlobsSelectList()
          {
              MyBL theBL = new MyBL();
              List<BlobEntity> blobEntites = theBL.GetBlobs();
              var listItems = blobEntites
                   .Select(x => new SelectListItem { Text = x.CompanyName,
                                                      Value = x.ID.ToString()
                                                   })
                   .ToList();
              SelectList blobsSelectList = new SelectList(listItems.AsEnumerable(), "Value", "Text");
              return blobsSelectList;
          }
      
         public class BlobEntity
         {
             public int ID { get; set; }
             public string CompanyName { get; set; }
         }
      

      如果您选择所有记录和所有列,则当前接受的答案(@VarunK)是可以的。但是,如果不是这种情况,最好在应用ToList() 之前对所需的列和记录进行投影。

      看看Why LINQ to Entities does not recognize the method 'System.String ToString()?

      其他参考:Problem with converting int to string in Linq to entities

      【讨论】:

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