我担心这个LINQ调用实际上会两次访问数据库(一次用于Contains,一次用于ToList),而我真正想要的只是嵌套select语句的SQL等价物:
var query1 = from y in e.cities where y.zip=12345 select y.Id;
var query2 = from x in e.users where query1.Contains(x.cityId) select x;
List<users> result = query2.ToList();
重点:如果这是两次数据库之旅,我该如何避免?我怎样才能有这样的嵌套select语句,它只能作为一次查询执行一次? Query1将只返回1或0行。必须有比使用“包含”更好的方法。
答案 0 :(得分:4)
由于query1
和query2
都是IQueryable
,因此只有一次访问数据库 - 当您致电query2.ToList()
时
您可以使用联接来组合查询,因为您正在查找相关信息,并且关系是用户的城市ID与您要限制的城市相同:
var result = (from x in e.users
join y in e.cities
on x.cityId equals y.Id
where y.zip == 12345
select x.Id).ToList();
上面应该为您提供一个用户ID列表(可能)存在于邮政编码12345中。