2011-01-20 2 views
0

Я пытаюсь выполнить поиск с LINQ to 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))); 

Я просто переместить сослагательного наклонения в код и построить запрос (или, вернее, 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#, по крайней мере, поэтому я бы ожидал, что его скорее всего будет поддерживать.

В качестве альтернативы вы можете просто заменить «1 == 1» на «true».

+0

пытался 1 == 1 => истинная же проблема – Para

+0

@Para: Вы попробовали мою альтернативную формулировку? Если вы попытались заменить '1 == 1' на' true', прежде чем публиковать свой вопрос, было бы неплохо, если бы вы упомянули об этом. –

+0

тоже попробовал это (я попробовал другой, даже после публикации, поэтому я упомянул об этом), так что теперь я попробовал оба из них, оба приводят к ошибке – Para

Смежные вопросы