Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq到NHibernate中的子查询_Linq_Nhibernate_Subquery_Linq To Nhibernate - Fatal编程技术网

Linq到NHibernate中的子查询

Linq到NHibernate中的子查询,linq,nhibernate,subquery,linq-to-nhibernate,Linq,Nhibernate,Subquery,Linq To Nhibernate,我在NHibernate 3.1中有一个Linq的问题: 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_

我在NHibernate 3.1中有一个Linq的问题:

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>();
}

为什么?

在sub\u 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)); 
var sub_q=SessionInstance.Query()
.Where(x=>x.Id<6).选择(x=>x.Id).ToList();
var q=SessionInstance.Query();
q=q,其中(x=>sub_q.包含(x.Id));
您可以尝试

q = q.Where(x => (SessionInstance.Query<Person>()
                 .Where(x => x.Id < 6).Select(x => x.Id)).Contains(x.Id)); 
q=q.Where(x=>(SessionInstance.Query()
。其中(x=>x.Id<6)。选择(x=>x.Id))。包含(x.Id));
关于第二个解决方案,我不太清楚


但我认为您必须执行
ToList()
来解决不同执行的问题

通过将sub_q中的
x
变量重命名为
xx

 var sub_q = SessionInstance.Query<Person>().Where(xx => xx.Id < 6).Select(xx => xx.Id);
 var sub_q = SessionInstance.Query<Person>().Where(xx => xx.Id < 6).Select(xx => xx.Id); 
var sub_q=SessionInstance.Query()。其中(xx=>xx.Id<6)。选择(xx=>xx.Id);

子查询中的
x
被查询中的
x
覆盖。通过更改它的名称,我的问题就解决了。

它不适合性能。这不是子查询。对于您的解决方案,子查询是一个列表,所以不要使用from子查询,它可以100%工作。性能对我来说很重要。您是否在v3.2甚至主干上尝试过这一点,因为Linq提供程序从v3.1开始就一直在使用?这可能是已修复的旧错误。