1

Bs と呼ばれる B の IList を持つエンティティ A と、Cs と呼ばれる C の IList を持つエンティティ A があります。

少なくとも 5 つの C が含まれるすべての A を検索したいと考えています。だから私は行って書いた

using (var s = this._sessionFactory.OpenSession())
{
    IQueryable<A> q = s.Linq<A>();
    // some code...
    if (range.Min.HasValue)                    
        q = q.Where(a => a.Bs.Sum(b => b.Cs.Count) >= range.Min.Value);
    // some code...
    return q.Select(b=>b).ToArray();
 }

ただし、コードを実行すると (範囲変数に Min が指定されていると)、次の例外が発生します。

NHibernate.QueryException : プロパティを解決できませんでした: Cs of: A

A の B のプロパティを探すのはなぜですか? ただし、マッピングは正しいようです:

A の (Fluent) マッピングは次のように述べています。

//...
HasMany(a => a.Bs)
 .Table("Bs")
 .KeyColumn("IdA")
 .Cascade.AllDeleteOrphan()
 .Inverse()
 .Not.LazyLoad();
//...

B のマッピングでは次のように述べています。

//...
HasMany(b => b.Cs)
 .Table("Cs")
 .KeyColumn("IdB")
 .Cascade.AllDeleteOrphan()
 .Inverse()
 .Not.LazyLoad();
References(b => b.A, "IdA")
 .Not.LazyLoad();
//...

最後に C のマッピングについて:

References(c => c.B, "IdB").Not.LazyLoad();
4

2 に答える 2

1

LINQ to NHibernateは、単純なクエリを簡単に実行するのに最適です。ただし、複雑なクエリ(このようなクエリ)を実行する必要がある場合は、多くの場合、条件APIまたはHQLに切り替える方が適切です。自由に使える3つのクエリ方法があり、それらすべてを使用します。

そうは言っても、NHibernate 3.0がリリースされると、LINQを使用してこのクエリを実行できる可能性があります。

于 2010-02-05T15:10:40.477 に答える
1

LINQ to NHibernate 2.xではできません

于 2010-02-11T14:14:34.490 に答える