在返回多个项目的LINQ表达式中获取成员身份数据时出错
本文关键字:成员 获取 身份 数据 出错 表达式 返回 项目 LINQ | 更新日期: 2023-09-27 18:24:01
我正在尝试创建一个显示员工列表的页面。
所有员工身份验证数据都存储在.NET成员资格表中,其他数据(如Name)存储在名为Employees的相关表中。
这是我获取员工列表的代码:
var viewModel = employees.OrderBy(e => e.Name).
Select(e => new EmployeeViewModel
{
EmployeeId = e.EmployeeID,
Name = e.Name,
Email = Membership.GetUser(e.UserID).Email,
Active = e.Active
});
我得到这个错误:
LINQ to Entities无法识别方法"System.Web.Security.MembershipUser GetUser(System.Object)"方法,并且此方法无法转换为存储表达式
我做了一些研究,发现我需要将Membership.GetUser
函数拉到LINQ表达式之外。如果我只得到一个员工,这会很好,但我会返回一个列表,所以每次迭代的用户都会不同。
有人知道我该怎么解决吗?
您可以在"客户端"端通过在Select(..)
:之前插入ToArray()
来评估您的选择
var viewModel = employees.OrderBy(e => e.Name)
.ToArray()
.Select(e => new EmployeeViewModel
{
EmployeeId = e.EmployeeID,
Name = e.Name,
Email = Membership.GetUser(e.UserID).Email,
Active = e.Active
});
在这种情况下,EF不会尝试翻译Membership.GetUser
方法。
编辑:正如评论中所指出的,这个解决方案虽然解决了您的问题,但引入了另一个问题:它将执行N+1选择,其中N是员工数量。
为了避免这种情况,您可以在EF模型中映射MemberShip
表,并在MemberShip
和Employee
表之间创建关系。然后,您可以通过一次选择获得所有数据,而无需使用Membership.GetUser()
。