在LINQ表达式中返回多个项目的成员资格数据时出错

时间:2012-02-09 20:01:13

标签: c# asp.net linq linq-to-entities

我正在尝试创建一个显示员工列表的页面。

所有员工身份验证数据都存储在.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函数。如果我只获得一名员工,这会很有效,但我会返回一个列表,因此每次迭代时用户都会有所不同。

任何人都知道如何解决这个问题?

1 个答案:

答案 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表,您可以在MemberShipEmployee表之间创建关系。然后,您可以使用一个选择获取所有数据,而无需使用Membership.GetUser()