我正在尝试创建一个显示员工列表的页面。
所有员工身份验证数据都存储在.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)'方法,并且此方法无法转换为商店表达式。
我做了一些研究,发现我需要在LINQ表达式之外拉Membership.GetUser
函数。如果我只获得一名员工,这会很有效,但我会返回一个列表,因此每次迭代时用户都会有所不同。
任何人都知道如何解决这个问题?
答案 0 :(得分:2)
您可以在ToArray()
之前插入Select(..)
评估“客户”方面的选择:
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()
。