我从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)中运行?
答案 0 :(得分:6)
对我而言,userName
,roles
和applications
是查询的参数,即数据来自您的应用程序,而不是来自数据库。在这种情况下,我会写这样的查询:
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();
这更具可读性,并且不会在生成的查询中包含不必要的混乱。
请注意,roles
和applications
不得代表其他查询的未执行结果。
“未执行结果”的意思是:
IEnumerable<Role> roles = context.Roles.Where(x => x = y);
答案 1 :(得分:0)
另一个解决方案是迭代记录获取另一个并聚合到最终列表。
它不是最快的,不是美,而是会解决。