LINQ 表达式节点类型“调用”在 LINQ to Entity with skip 中不受支持

本文关键字:LINQ skip with 支持 Entity 节点 表达式 类型 调用 to | 更新日期: 2023-09-27 18:32:29

>我有错误 LINQ 表达式节点类型"Invoke"在 LINQ to Entities 中不受支持。

var result = context.Users.Include("Roles")
                          .OrderBy(x => x.UserID)
                          .Where(x => !userIsAdmin(x))
                          .Skip(skip)
                          .Take(take)
                          .ToList();
private readonly Func<User, bool> userIsAdmin = u => u.Roles.Any(y => y.Name.Equals(AdminRoleName));

我哪里写错了?

LINQ 表达式节点类型“调用”在 LINQ to Entity with skip 中不受支持

LINQ

to SQL 和 LINQ to Entities 都适用于Expression,而不是Func(如 LINQ to Objects),因此您必须将userIsAdmin声明为 Expression<Func<User, bool>>

private readonly Expression<Func<User, bool>> userIsAdmin = u => u.Roles.Any(y => y.Name.Equals(AdminRoleName));

您还应考虑将表达式更改为:

private readonly Expression<Func<User, bool>> userIsAdmin = u => u.Roles.Select(y => y.Name).Contains(AdminRoleName));

它应该在生成的 SQL 查询中转换为IN语句。

MarcinJuraszek走在正确的轨道上。您可以将谓词更改为:

private readonly Expression<Func<User, bool>> userIsNotAdmin = u => !u.Roles.Any(y => y.Name.Equals(AdminRoleName));

请注意,这是您拥有的内容的反转。

然后你应该可以这样称呼它:

var result = context.Users.Include("Roles")
                      .OrderBy(x => x.UserID)
                      .Where(userIsNotAdmin)
                      .Skip(skip)
                      .Take(take)
                      .ToList();