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

mus*_*ium 3 c# sql linq entity-framework where

我从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 ();
Run Code Online (Sandbox Code Playgroud)

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

如何更改我的查询,它将在EF 5(.Net 4.0)中有效?

Dan*_*rth 6

对我来说,它看起来像userName,rolesapplications为参数的查询,即数据来自您的应用程序,而不是从数据库中.在这种情况下,我会写这样的查询:

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();
Run Code Online (Sandbox Code Playgroud)

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

请注意,roles并且applications不得代表另一个查询的未执行结果."未执行结果"的意思是:

IEnumerable<Role> roles = context.Roles.Where(x => x = y);
Run Code Online (Sandbox Code Playgroud)