2011-01-20 63 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