LINQ to Entities不识别方法';System.String-ToString()';方法

本文关键字:方法 String-ToString System to LINQ Entities 识别 | 更新日期: 2023-09-27 18:27:50

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

我有一个我不理解的错误:

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);
        }

LINQ to Entities不识别方法';System.String-ToString()';方法

您收到此错误是因为实体框架不知道如何在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)
});

编辑:为了更清楚,Entity框架将您使用的查询运算符(如SelectWhereETC)转换为sql查询来加载数据。如果您调用像ToString()这样的方法,而实体框架在sql中没有等效的方法,它会抱怨。因此,我们的想法是在数据加载后推迟使用此类函数。CCD_ 7、CCD_ 8 ETC强制执行查询从而加载数据。一旦数据被加载,任何进一步的操作(例如SelectWhereETC)都是使用Linq-to-Objects对已经在存储器中的数据执行的。

如果…您使用:

Value = c.id + "",

而不是

Value = c.id.ToString(),

编辑

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

只使用委托:

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

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

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

相关文章: