【问题标题】:Creating a collection of SelectListItem with LINQ使用 LINQ 创建 SelectListItem 的集合
【发布时间】:2012-03-21 20:07:15
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 如果您不想接收所有列,也可以使用:var users = (from u in _usersRepository.Users where .... select new {u.FirstName, u.LastName, u.UserID}).ToList().Select(u => new SelectListItem { Text = u.FirstName + " " + u.LastName, Value = u.UserID.ToString() });
  • 如果我们希望它与FirstName不同怎么办?
  • @Halter 你无法在 Linq 的单行中做到这一点。获得文本/值对后,您必须遍历每个项目,将其添加到列表中,然后再次循环遍历 Linq 结果并检查列表是否已经包含您的项目 - 将项目添加到新的“更正列表”,如果他们没问题。
【解决方案2】:

我想你在找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 });

【讨论】:

  • 这会保留查询的延迟执行吗?因为如果是这样(老实说,我完全不知道),如果这很重要,这可能是一个更好的选择。
  • 保留延迟执行。 LINQ to Entities 提供程序能够将SqlFunctions 的方法解析为等效的SQL。因此,您可以像更典型的查询一样编写和执行此查询。
  • 很高兴知道!将此问题添加为书签以供将来参考,感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多