Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持跳过_C#_Linq - Fatal编程技术网

C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持跳过

C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持跳过,c#,linq,C#,Linq,我有一个错误,LINQ to实体中不支持LINQ表达式节点类型“Invoke” var result = context.Users.Include("Roles") .OrderBy(x => x.UserID) .Where(x => !userIsAdmin(x)) .Skip(skip)

我有一个错误,LINQ to实体中不支持LINQ表达式节点类型“Invoke”

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));
var result=context.Users.Include(“角色”)
.OrderBy(x=>x.UserID)
.Where(x=>!userIsAdmin(x))
.Skip(Skip)
.拿(拿)
.ToList();
私有只读Func userIsAdmin=u=>u.Roles.Any(y=>y.Name.Equals(AdminRoleName));

我哪里写错了?

LINQ to SQL和LINQ to Entities都在
表达式
上工作,而不是
函数
(就像LINQ to Object那样),因此您必须将
用户isadmin
声明为
表达式

private只读表达式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));
private readonly Expression userIsAdmin=u=>u.Roles.Select(y=>y.Name).Contains(AdminRoleName));

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

表达式
上工作,而不是在
函数
(像LINQ-to-Objects那样),因此您必须将
用户isadmin声明为
表达式

private只读表达式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));
private readonly Expression userIsAdmin=u=>u.Roles.Select(y=>y.Name).Contains(AdminRoleName));

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

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

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

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

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

我有一个新的错误-名称“userIsAdmin”在当前上下文中不存在,根本不起作用。(x=>!userIsAdmin(x))将出错,因为您无法调用这样的表达式,因为它不是委托。我有一个新错误-当前上下文中不存在名称“userIsAdmin”,这根本不起作用。(x=>!userIsAdmin(x))将出现故障,因为您无法调用这样的表达式,因为它不是委托。@Amit here:
。其中(x=>!userIsAdmin(x))
其中
使用lambda参数构建表达式;在这个表达式中,userIsAdmin是一个
Func
,因此,它被转换为,EntityFramework不支持
表达式。调用
,因为它不知道如何将它转换为SQL。在这里看一下这个@Amit:
。其中(x=>!userIsAdmin(x))
其中
使用lambda参数构建表达式;在这个表达式中,userIsAdmin是一个
Func
,因此,它被转换为,EntityFramework不支持
表达式。调用
,因为它不知道如何将其转换为SQL。请看这个