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
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();