使用LINQ创建SelectListItem的集合

时间:2012-03-21 20:07:16

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

我正在尝试在我的视图中显示用户的下拉列表。这是我在控制器方法中使用的代码:

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的集合?

2 个答案:

答案 0 :(得分:35)

ToString()只能在Linq to Objects中使用。一个简单的解决方案是按如下方式插入.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 });

这将返回User表中的所有用户。如果您可以减少从数据库中获得的用户数量,那么您的查询将更有效,例如

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

答案 1 :(得分:9)

我认为你正在寻找SqlFunctions

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