C# 使用LINQ创建SelectListItem的集合
我试图在视图中显示用户的下拉列表。以下是我在控制器方法中使用的代码:C# 使用LINQ创建SelectListItem的集合,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我试图在视图中显示用户的下拉列表。以下是我在控制器方法中使用的代码: var users = _usersRepository.Users.Select(u => new SelectListItem { Text = u.FirstName + " " + u.LastName,
var users = _usersRepository.Users.Select(u => new SelectListItem
{
Text = u.FirstName + " " + u.LastName,
Value = u.UserID.ToString()
}
return View(new MyViewModel { Users = users });
尝试将UserID
转换为字符串时出错:
LINQ to Entities无法识别方法“System.String ToString()”方法,并且无法将此方法转换为存储表达式。
如何从实体创建SelectListItem
集合?ToString()
只能在Linq to对象中使用。一个简单的解决方案是插入.ToList()
,如下所示:
var users = _usersRepository.Users.ToList().Select(u => new SelectListItem
{
Text = u.FirstName + " " + u.LastName,
Value = u.UserID.ToString()
});
return View(new MyViewModel { Users = users });
这将返回用户表中的所有用户。如果您可以减少从数据库获得的用户数量,您的查询将更加高效,例如:
var users = _usersRepository.Users.Where( u => .... ).ToList().Select(u => new SelectListItem
{
Text = u.FirstName + " " + u.LastName,
Value = u.UserID.ToString()
});
return View(new MyViewModel { Users = users });
我想你在找我
看看这个:这会保留查询的延迟执行吗?因为如果是这样的话(我真的不知道怎么说),如果这很重要的话,这可能是一个更好的选择。延迟执行会被保留。LINQtoEntities提供程序能够将
SqlFunctions
的方法解析为它们的等效SQL。因此,您可以像编写和执行更典型的查询一样编写和执行此查询。很高兴知道!将此问题加入书签以供将来参考,感谢您的澄清!如果您不想接收所有列,您也可以使用:var users=(从{u usersRepository.users where….中的u选择新的{u.FirstName,u.LastName,u.UserID}).ToList().select(u=>new-SelectListItem{Text=u.FirstName+“”+u.LastName,Value=u.UserID.ToString())
如果我们想让它通过FirstName
来区分,该怎么办?@Halter您将无法在Linq的一行程序中做到这一点。在获得文本/值对之后,您必须迭代每个项目,将其添加到列表中,然后再次循环Linq结果,并检查列表是否包含您的项目,如果没有问题,则将项目添加到新的“更正列表”。
using System.Data.Objects.SqlClient;
var users = _usersRepository.Users.Select(u => new SelectListItem
{
Text = u.FirstName + " " + u.LastName,
Value = SqlFunctions.StringConvert((double?)u.UserID)
}
return View(new MyViewModel { Users = users });