条件付きロジックを使用して IQueryOver を装飾しようとしています。顧客検索を表すオブジェクトのプライベート メソッドである次のコードを検討してください。
private void addCustomerCriterion<T>(IQueryOver<T, T> query) where T : Customer
{
if (!string.IsNullOrEmpty(Name))
query = query
.Where(x => x.FirstName.ToUpper().Contains(Name.ToUpper()) ||
x.LastName.ToUpper().Contains(Name.ToUpper()));
if (HasOpenTicket.HasValue)
query = query
.Inner.JoinQueryOver<ServiceTicket>(c => c.ServiceTickets)
.Where(t => t.StatusName == "Open")
}
if (HasOpenInvoice.HasValue)
query = query
.Inner.JoinQueryOver<Invoice>(c => c.Invoices)
.Where(i => i.StatusName == "Open");
}
残念ながら、これはコンパイルされません。2 番目と 3 番目の if ステートメントで、流暢なインターフェイスのタイプ セーフを破っているので、理にかなっています。http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspxによると、 JoinQueryOver はクエリを QueryOver (顧客、顧客) から QueryOver に変換します(顧客、ServiceTicket)。query = query イディオムを使用して装飾しようとすると、型が一致しなくなりました。
したがって、ここでの本当の問題は、Customer オブジェクトから ServiceTicket リレーションシップにたどり着き、QueryOver オブジェクトの型が変更されたことです。元のルート Customer オブジェクトに内部結合を追加し続けることができるように、ツリーをさかのぼってトラバースするにはどうすればよいですか?