2011-01-20 10 views
0

NHibernateにLINQで検索しようとしています。Linq to nhibernate sql 1 = 1相当の

私はこのコードを持っている:

from d in rep.QueryAll<Document>() 
        where 
         d.Plata != null && d.Contractant != null && d.Stadiu == StadiuDocument.Polita 
         && (d.NrPolita.Contains(query) || 
          d.Contractant.CodUnic.Contains(query) || 
          d.Contractant.Denumire.Contains(query) || 
          d.Plata.IdTranzactie.Contains(query)) && 
          ((TipPolita != null) ? (d.Tip == (TipProdus)TipPolita) : (1 == 1)) && 
          ((StareDocument != null) ? (d.Stare == (StareDocument)StareDocument) : (1 == 1)) 
        select new 
        { 

問題は、私は一般的な値を持っているいくつかの選択入力を持っているということです。

<select id="tippolita" > 
     <option value = "-1">Any value</option> 
     <option value = "1">Value 1</option> 
     <option value = "2">Value 2</option> 
     <option value = "3">Value 3</option> 
    </select> 

「任意の値」が選択された場合、私はここに書いたようなのでwhere文が真でなければなりません:

((TipPolita != null) ? (d.Tip == (TipProdus)TipPolita) : (1 == 1)) && 
((StareDocument != null) ? (d.Stare == (StareDocument)StareDocument) : (1 == 1)) 

これは、ほとんど私はSQLで記述したものと同じである。このような何か

エラーは、このエラーは、実際に再LINQライブラリから来て

_expression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression); 

ファイルの行33でNHibernateのソースコード内で「LINQの\ NHLinqExpression.cs」を発生します。

明らかな回避策の1つは、3つのif文を記述し、それぞれに適切なLINQクエリを入れることですが、それはより多くのコードを書くことを意味します。

クエリ全体をコピーして貼り付けずに少しだけ変更するだけで、このようなクエリを実行する方法はありますか?

P.S.

これは、内部例外である:「私はそれかどうかわからない

(TipPolita == null || d.Tip == (TipProdus)TipPolita) && 
(StareDocument == null || d.Stare == (StareDocument)StareDocument) 

として

((TipPolita != null) ? (d.Tip == (TipProdus)TipPolita) : (1 == 1)) && 
((StareDocument != null) ? (d.Stare == (StareDocument)StareDocument) : (1 == 1)) 

InnerException: System.NullReferenceException 
     Message=Object reference not set to an instance of an object. 
     Source=Anonymously Hosted DynamicMethods Assembly 
     StackTrace: 
      at lambda_method(Closure 

答えて

0

まあ、これに適切な方法

  var date = rep.QueryAll<Document>().Where(d => d.Plata != null && d.Contractant != null && d.Stadiu == StadiuDocument.Polita); 

     if (!string.IsNullOrEmpty(query)) 
      date = date.Where(d => (d.NrPolita.Contains(query) || 
          d.Contractant.CodUnic.Contains(query) || 
          d.Contractant.Denumire.Contains(query))); 

私はちょうど少しずつコードにIFSを移動し、クエリを作成(というかのIQueryable)を行う方法を考え出し

1

私はこれを書き換えるだろうNHibernateで動作するかどうかは分かりませんが、それは少なくとも慣用的なC#は、私はそれがサポートされる可能性が高いと期待します。

代わりに、「1 == 1」を「true」に置き換えることができます。

+0

は1 ==を試してみました1 => true同じ問題 – Para

+0

@Para:代替案を試しましたか?あなたの質問を投稿する前に '1 == 1'を' true'に置き換えようとしたなら、あなたがそれを言いました。 –

+0

これもやってみました(私は他のものも試してみましたので、私はそれをbeofreと言いました)、両方とも試してみましたが、どちらもエラーになります – Para