2

我正在尝试在 MVC 3 内的创建视图中填充组合框。这是我到目前为止所做的:

    public ActionResult Create()
    {
        var db = new ErrorReportingSystemContext();
        IEnumerable<SelectListItem> items = db.Locations
          .Select(c => new SelectListItem
          {
              Value =c.id,
              Text = c.location_name
          });
        ViewBag.locations = items;
        return View();
    } 

但是,当我尝试运行它时,会出现编译错误:

Cannot implicitly convert int to string

这篇文章中,我读到这样做

Value = SqlFunctions.StringConvert((double)c.ContactId)

可以解决问题,但是当我尝试这样做时,出现以下错误:

the name 'SqlFunctions' does not exist in the current context

我在做什么错?

更新:

Value = c.id.ToString()给出了错误:

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

4

3 回答 3

6

您的问题是 EF 无法将转换转换为字符串或.ToString()方法。

因此,您需要.AsEnumerable()在选择SelectListItems之前评估数据库查询(使用调用)

IEnumerable<SelectListItem> items = db.Locations
      .AsEnumerable()
      .Select(c => new SelectListItem
      {
          Value = c.id.ToString(),
          Text = c.location_name
      });

然而,这种方法存在一些性能问题,因为生成的 SQL 查询将如下所示:

SELECT * FROM Locations ...

因此,如果 Locations 表有 50 列,EF 将加载所有列中的数据,尽管稍后您只需要两列中的数据。

您可以告诉 EF 它应该加载哪些列,首先选择匿名类型,然后选择 SelectListItems:

IEnumerable<SelectListItem> items = db.Locations
      .Select(c => new
      {
          c.id,
          c.location_name
      });
      .AsEnumerable()
      .Select(c => new SelectListItem
      {
          Value = c.id.ToString(),
          Text = c.location_name
      });

生成的查询看起来像这样:

 SELECT id, location_name FROM Locations
于 2012-09-17T19:40:33.753 回答
0
foreach (var item in db.table.tolist())
{
                Combobox.Items.Add(item.field.tostring());
}
于 2012-09-17T16:15:56.357 回答
0

它可能会抱怨Value需要一个字符串,而您正试图在int其中存储一个字符串。

尝试:

Value = c.id.ToString(),
于 2012-09-17T16:07:44.497 回答