SQL 语句的某些部分嵌套得太深 c# EF 5

本文关键字:EF 嵌套 语句 些部 SQL | 更新日期: 2023-09-27 18:32:40

我从 EF 5 中收到以下异常:SQL 语句的某些部分嵌套得太深。重写查询或将其分解为较小的查询。

这是我的查询:

String username = “test”;
IEnumerable<Int32> roles;
IEnumerable<Int32> applications;
cnx.Users.Where ( it =>
( userName != null ?  it.name = = userName : true )  &&
( !roles.Any () || roles.Contains ( it.role_id ) ) &&
( ! applications.Any () || applications.Contains ( it.application_id ) ) )
               .Count ();

用户是一个简单的表。角色和应用程序都是 IEnumerable 类型,可以为空。

如何更改我的查询,使其在 EF 5 (.Net 4.0) 中工作?

SQL 语句的某些部分嵌套得太深 c# EF 5

对我来说

,看起来像userNamerolesapplications是查询的参数,即数据来自您的应用程序而不是来自数据库。在这种情况下,我会像这样编写查询:

IQueryable<User> query = cnt.Users;
if(userName != null)
    query = query.Where(x => x.name == userName)
if(roles.Any())
    query = query.Where(x => roles.Contains(x.role_id));
if(applications.Any())
    query = query.Where(x => applications.Contains(x.application_id))
var result = query.Count();

这更具可读性,并且不会在生成的查询中包含不必要的混乱。

请注意,rolesapplications 不得表示另一个查询的未执行结果。对于"未执行的结果",我的意思如下:

IEnumerable<Role> roles = context.Roles.Where(x => x = y);

另一种解决方案是迭代记录,获取其他记录并聚合到最终列表。

它不是最快的,不是美丽的,但会解决。