1

条件付きロジックを使用して 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 オブジェクトに内部結合を追加し続けることができるように、ツリーをさかのぼってトラバースするにはどうすればよいですか?

4

1 に答える 1

2

あなたが持っている元の IQueryOver は変更可能で、 JoinQueryOver への呼び出しを登録するので、戻り値を保存する必要はありません (結合されたエンティティからさらに条件付き結合を追加する必要がない限り)。

于 2010-12-17T12:40:04.237 に答える