NHibernateを使用して複数の子コレクションを検索する場合、ラムダよりもLINQクエリ構文を使用する傾向があります。これは、記述がはるかに簡単であるだけでなく、コードがよりクリーンに見えるためです。
あなたを正しい方向に向けるべきこの例を見てください:
var listOfString = new List<string>() { "String1", "String2" };
var customers =
(
from a in session.Query<A>()
from b in a.B
from c in b.C
where a.Status == "Active"
&& listOfStrings.Contains( b.SomeField )
&& listOfStrings.Contains( c.someOtherField )
select a )
.ToList();
LINQクエリ構文を使用すると、複数のFROMを簡単に追加して、子コレクションにアクセスできます。次に、WHERE条件を適用するだけです。特定のケースでは、SQLのIN演算子と同等のLINQのContains()メソッドを使用するだけです。
また、すべての子コレクションをメモリにロードしたいようですので、NHibernateの.Fetch()メソッドを使用して、次のようにそのデータを熱心にロードしてください。
var customers =
(
from a in session.Query<A>()
from b in a.B
from c in b.C
where a.Status == "Active"
&& listOfStrings.Contains( b.SomeField )
&& listOfStrings.Contains( c.someOtherField )
select a )
.Fetch( x => x.B )
.ThenFetchMany( x => x.First().C )
.ToList();
参考までに、上記の.ThenFetchMany()メソッド内で.First()を使用することは、NHibernateのJira Issue Tracker Webサイト(https://nhibernate.jira.com/browse/NH-2972?focusedCommentId=22150&page=com )から学んだトリックです。 .atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22150