获取从数据库创建组合框时,无法将int隐式转换为字符串

时间:2012-09-17 16:06:06

标签: c# asp.net-mvc-3

我正在尝试在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

this帖子中,我读到了

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.

3 个答案:

答案 0 :(得分:6)

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

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

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应该加载哪些列,首先选择匿名类型然后加入SelectListItem s:

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

答案 1 :(得分:0)

可能抱怨Value需要一个字符串而你正试图在其中存储int

尝试:

Value = c.id.ToString(),

答案 2 :(得分:0)

foreach (var item in db.table.tolist())
{
                Combobox.Items.Add(item.field.tostring());
}