升级到NHibernate 3.1:LINQ、Any和映射组件集合的错误

升级到NHibernate 3.1:LINQ、Any和映射组件集合的错误,nhibernate,Nhibernate,我们目前正在从NHibernate 2升级到3.1。以下场景适用于旧的LINQ提供程序,但不适用于NHibernate 3.1中的新提供程序 以下是该场景的映射: public class FooDbMap : ClassMap<Foo> { public FooDbMap() { Id(x => x.Id); HasMany(x => x.Bars) .Component(part =>

我们目前正在从NHibernate 2升级到3.1。以下场景适用于旧的LINQ提供程序,但不适用于NHibernate 3.1中的新提供程序

以下是该场景的映射:

public class FooDbMap : ClassMap<Foo>
{
    public FooDbMap()
    {
        Id(x => x.Id);

        HasMany(x => x.Bars)
            .Component(part =>
                {
                    part.Map(y => y.Name);
                })
            .KeyColumn("FooId")
            .Table("FooBars");
    }
}
但是,以下查询会生成一个错误:

Session.Query<Foo>()
    .Where(foo => foo.Bars.Any())
    .ToList();
几乎正确,但不完全正确-在最后一分钟,NHibernate搞错了,决定在Bar表上应该有一个Id列

这个问题在旧的Linq到Nhibernate提供程序中并不常见


我可以想出一些解决办法,但这是NHibernate的bug还是功能?

这是一个bug。您可以在这里投票:

错误仍然存在于NHibernate 3.3.3中

作为解决方法,您可以使用
.Count()>0

Session.Query<Foo>()
    .Where(foo => foo.Bars.Count() > 0)
    .ToList();
Session.Query()
.Where(foo=>foo.bar.Count()>0)
.ToList();
select foo0_.Id as Id20_
from Foo foo0_
where exists (select bar1_.Id from Bar bar1_
              where foo0_.Id = bar1_.FooId)
Session.Query<Foo>()
    .Where(foo => foo.Bars.Count() > 0)
    .ToList();