在返回多个项目的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表达式之外。如果我只得到一个员工,这会很好,但我会返回一个列表,所以每次迭代的用户都会不同。

有人知道我该怎么解决吗?

在返回多个项目的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表,并在MemberShipEmployee表之间创建关系。然后,您可以通过一次选择获得所有数据,而无需使用Membership.GetUser()