いつものように、Marc Gravell♦ は非常に洞察に満ちた回答を提供してくれましたが、IQueryablesを使用して制限を追加するメソッドを使用すると、ほとんどの場合に機能し、コードがより明確になり、保守が容易になると思います。例えば:
//Join
public static IQueryable<IContract> AllContracts(this IQueryable<IAccount> accounts, ISession s ) {
return from a in accounts
from contract in s.Query<IContract()
where (a.Id == contract.AccountId)
select contract;
}
//Where
public static IQueryable<IContract> Active(this IQueryable<IContract> contracts) {
return from contract in contracts
where (contract.Active == true)
select contract;
}
次に、これらを次のように組み合わせて一致させることができます。
IQueryable<IContract> activeContracts = s.Query<IAccount>()
.Where(o => o.Name == "XXX")
.GetContracts(s)
.Active();
ここでは拡張メソッドと NHiberante の LINQ 提供のQueryメソッドを使用していますが、これは静的メソッドや LINQ プロバイダーを使用せずに簡単に書き直すことができます。