2012-03-21 38 views
15

我试图在我的视图中显示用户的下拉列表。下面是我用在我的控制器方法的代码:使用LINQ创建SelectListItem的集合

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到实体无法识别方法“系统。 String ToString()'方法,并且此方法不能转换为存储表达式。

如何从我的实体创建一个SelectListItem的集合?

+0

看看这个:http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method – 2012-03-21 20:14:45

回答

30

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

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

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

如果你不想接收你也可以使用的所有列:var users =(来自你在_usersRepository.Users中的u,其中.... select new {u.FirstName ,u.LastName,u.UserID})。ToList()。Select(u => new SelectListItem {Text = u.FirstName +“”+ u.LastName,Value = u.UserID.ToString()});' – 2013-12-12 10:12:51

+0

如果我们想让它与“FirstName”区分呢? – Halter 2017-05-18 15:31:26

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

这是否会保留延迟执行的查询,但?因为如果是这样(我真的不知道我的头顶),如果这很重要,这可能是一个更好的选择。 – 2012-03-21 22:48:40

+1

延迟执行被保留。 LINQ to Entities提供者能够将'SqlFunctions'的方法解析为其等效的SQL。因此,您可以像更典型的查询一样编写和执行此查询。 – Sorax 2012-03-22 13:29:40

+0

很高兴知道!收藏此问题以供将来参考,谢谢澄清! – 2012-03-22 17:17:21