我正在尝试在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.
答案 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());
}