2011-01-20 2 views
0

Hibernate에 LINQ로 검색하려고합니다.Linq to nhibernate sql 1 = 1 equivalent

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에 쓴다 것과 동일합니다.

오류가 파일 "Linq에 \ NHLinqExpression.cs"

_expression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression); 

이 오류는 실제로 재 LINQ 라이브러리에서 제공에 라인 (33)에 NHibernate에 소스 코드 내에서 발생합니다.

한 가지 확실한 해결 방법은 3 개의 if 문을 작성하고 각각에 적절한 LINQ 쿼리를 넣는 것입니다.하지만 훨씬 많은 코드를 작성해야합니다.

전체 쿼리를 복사하여 붙여 넣지 않고 약간만 수정하면 이러한 종류의 쿼리를 수행 할 수 있습니까?

P.

이 내부 예외 :

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#은 적어도 지원할 가능성이 더 많습니다.

대신 "1 == 1"을 "true"로 바꿀 수 있습니다.

+0

1 == 시도 1 => 참 똑같은 문제 – Para

+0

@Para : 대체 배합을 시도 했습니까? 질문을 게시하기 전에'1 == 1'을'true'로 바꾸려고 시도했다면, 그렇게 말하면 좋을 것입니다. –

+0

는 지금도 시도했습니다. (게시하기 전에 다른 하나를 시도해 보았습니다. 그 이유는 내가 beofre를 언급했기 때문입니다.) 이제는 두 가지 모두 시도해 보았습니다. 오류가 발생했습니다. – Para