2011-01-20 86 views
0

我正在嘗試使用LINQ進行NHibernate搜索。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編寫。

錯誤NHibernate的源代碼的內部,在線路33上的文件「的LINQ \ NHLinqExpression.cs」

_expression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression); 

此錯誤實際上來自重新LINQ庫中出現。

一個明顯的解決方法是隻寫3個if語句,並在其中添加適當的LINQ查詢,但這意味着需要編寫更多的代碼。

有什麼辦法可以使這種查詢工作,而無需複製粘貼整個查詢並修改它的一小部分?

P.S.

這是內部異常:

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

我想改寫這個:

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

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

我不知道它是否」我會在NHibernate中工作,但它是至少更習慣於C#,所以我期望它更有可能得到支持。

作爲一種替代方法,您可以用「true」替換「1 == 1」。

+0

試過1 == 1 =>同樣的問題 – Para 2011-01-20 09:38:18