Linq to nhibernate sql 1 = 1 эквивалент - PullRequest
0 голосов
/ 20 января 2011

Я пытаюсь выполнить поиск с помощью 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>

Поэтому, когда выбрано «Любое значение», оператор 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);

Эта ошибка на самом деле происходит из библиотеки re-linq.

Один очевидный обходной путь - просто написать 3 оператора if и поместить соответствующие запросы LINQ в каждый из них, но это означает написание гораздо большего количества кода.

Есть ли способ заставить этот тип запроса работать, не вставляя копирование всего запроса и не изменяя его немного?

приписка

Это внутреннее исключение:

  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 ]

1 голос
/ 20 января 2011

Я бы переписал это:

((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 голосов
/ 20 января 2011

Ну, разобрался, как это сделать правильно

            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)));

Я просто перемещаю if в код и строю запрос (точнее IQueryable) побитово

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...