我正在尝试使用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
)
答案 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)