Linq到NHibernate的子查询

时间:2012-02-22 06:46:42

标签: linq nhibernate subquery linq-to-nhibernate

我在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);

为什么?

2 个答案:

答案 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覆盖。通过更改它的名称,我的问题得到了解决。