1


0

NHibernateへのLINQは子供の子供に到達することはできません

エンティティAにはBと呼ばれるBのIListがあり、BにはCと呼ばれるCのIListがあります。

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

using (var s = this._sessionFactory.OpenSession())
{
    IQueryable q = s.Linq();
    // 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();

2 Answer


1


LINQ to NHibernateは、簡単なクエリを簡単に作成するのに最適です。 ただし、複雑なクエリ(このクエリなど)を実行する必要がある場合、多くの場合、条件APIまたはHQLに切り替えることをお勧めします。 3つのクエリメソッドを自由に使用できます。すべて使用します。

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


1


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