我在Liniber的NHibernate 3.1中有一个查询:
public IList<Person> Search()
{
var sub_q = SessionInstance.Query<Person>().Where(x => x.Id < 6).Select(x => x.Id);
var q = SessionInstance.Query<Person>();
q = q.Where(x => sub_q.Contains(x.Id));
return q.ToList<Person>();
}
Id列是数据库中的主键 此子查询不起作用。使用子查询的查询计数等于我的查询计数而不使用子查询。
我的查询whit子查询的计数:52 //正确计数是5
没有子查询的查询计数:52
为什么呢?
更新
通过将sub_q中的x
变量重命名为xx
var sub_q = SessionInstance.Query<Person>().Where(xx => xx.Id < 6).Select(xx => xx.Id);
为什么?
答案 0 :(得分:2)
在sub_q上应用ToList方法可能会解决您的问题,因为可能存在 linq不同执行的问题..
代码就像
var sub_q = SessionInstance.Query<Person>()
.Where(x => x.Id < 6).Select(x => x.Id).ToList();
var q = SessionInstance.Query<Person>();
q = q.Where(x => sub_q.Contains(x.Id));
或您可以尝试
q = q.Where(x => (SessionInstance.Query<Person>()
.Where(x => x.Id < 6).Select(x => x.Id)).Contains(x.Id));
不确定上面的第二个解决方案
但我认为你必须做ToList()
才能解决执行不同的问题..
答案 1 :(得分:0)
我的问题通过将sub_q中的x
变量重命名为xx
var sub_q = SessionInstance.Query<Person>().Where(xx => xx.Id < 6).Select(xx => xx.Id);
子查询中的 x
在查询中被x
覆盖。通过更改它的名称,我的问题得到了解决。