Linq to nhibernate sql 1 = 1等效

时间:2011-01-20 09:16:41

标签: linq nhibernate

我正在尝试使用LINQ to NHibernate进行搜索。

我有这段代码:

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>

所以当选择“Any value”时,where语句应该是真的,就像我在这里写的那样:

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

这与我在SQL中编写的几乎相同。

文件“Linq \ NHLinqExpression.cs”中第33行的Nhibernate源代码内发生错误

_expression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression);

此错误实际上来自re-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 

2 个答案:

答案 0 :(得分: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#,所以我希望它更有可能得到支持。

作为替代方案,您可以将“1 == 1”替换为“true”。

答案 1 :(得分: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)