36

我正在使用 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);
        }
4

4 回答 4

66

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

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

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

于 2013-08-14T14:19:36.913 回答
2

如果......你使用:

Value = c.id + "",

代替

Value = c.id.ToString(),

编辑

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

于 2015-10-08T13:32:43.480 回答
0

只需使用委托:

var query = dba.blob.Select(delegate(blob c)
{
    return new SelectListItem
        {
            Value = c.id.ToString(),
            Text = c.name_company,
            Selected = c.id.Equals(3)
        };
});
于 2017-02-06T11:30:55.183 回答
0

以下是我如何将其显示为 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()

看看为什么 LINQ to Entities 无法识别方法 'System.String ToString()?.

其他参考:在 Linq 中将 int 转换为字符串到实体的问题

于 2017-06-06T21:13:55.177 回答