문제

엔티티 프레임 워크를 사용하고 있으며 주석 엔티티가 있습니다. 주석에는 DateModified 속성이 있으며, 이는 무효 일입니다. 날짜별로 댓글을 필터링하는 쿼리를 작성하려고하므로 startDate 객체를 만들고 다음을 수행합니다.

Dim q As ObjectQuery(Of COMMENT) = _ 
   (From c In model.COMMENT Select c)

If startDate.HasValue Then
   q = q.Where(Function(c) startDate.Value <= c.DATEMODIFIED)
End If

문제는 Q.tolist ()가 의견을 제시해야한다고 생각하더라도 의견을 반환하지 않는다는 것입니다. 데이터베이스의 모든 주석에는 DateModified 값이 있으며 DateTime.minValue를 STARTDATE로 전달하더라도 쿼리는 여전히 엔티티와 일치하지 않습니다.

if 진술 전에 중단 점을 설정하고 Visual Studio Watch 창을 사용하여 무슨 일이 일어나고 있는지 확인했습니다.

q.ToList()(0).DATEMODIFIED    'Returns the expected date 
startDate.Value               'Returns the expected date 
startDate.Value <= q.ToList()(0).DATEMODIFIED    'Returns True...

그러나 일단 q = Q.here (Prescetice) 부분에 도달하면 q.tolist ()는 더 이상 항목을 반환하지 않습니다. 난 그만 둔다.

도움이 되었습니까?

해결책

업데이트: 죄송합니다. LINQ에서 엔티티를 사용하면 표현식이 코드에서 후 처리되는 대신 SQL 호출로 변환되는 모든 곳에서 아래의 디버깅 제안이 반드시 작동하지는 않습니다.

따라서 데이터베이스에 대해 동일한 생성 된 SQL 문을 실행하고 엔티티 프레임 워크 제공 업체가 생성 한 SQL이 실제로 기대하는 데이터를 반환하는지 여부를 확인하는 것으로 시작합니다. 위의 @craig Stuntz의 의견은이 작업을 수행하는 데 도움이되는 올바른 궤도에 있습니다. 매개 변수화 된 SQL이 있으면 코드에서 직접 해당 SQL을 실행하려고합니다. System.Data.OracleClient)) 그리고 실제로 해당 쿼리에서 결과를 다시 받는지 확인합니다. 얻은 것과 동일한 매개 변수 값을 주입하는 것을 잊지 마십시오. ObjectQuery.Parameters. 또는 자신의 매개 변수를 스스로 고정하고 선택한 Oracle 클라이언트 앱에서 쿼리를 실행할 수 있습니다.

해당 SQL에서 결과를 얻지 못하면 Devart의 제공자가 쿼리를 잘못 구축 할 수 있습니다.

LINQ-to-Entities가 아닌 LINQ-to-Objects 문제 해결에 적용되므로 여기 아래의 내용을 무시할 수 있습니다.

이것을 진단하기위한 몇 가지 아이디어 :

먼저, 시계 창에서 이것을 시도하십시오.

q.Where(Function(c) startDate.Value <= c.DATEMODIFIED).Count()

나는 이것이 0을 반환 할 것이라고 가정하지만, 결과를 얻지 못하도록 다른 많은 변수를 제거하는 것이 좋습니다.

다음으로, 나는 당신의 linq 쿼리를 약간 다르게 정의하는 것입니다- 어디에 ()를 개별적으로 추가하는 대신 다음과 같은 두 개의 쿼리를 사용해보십시오.

Dim q As ObjectQuery(Of COMMENT)
If startDate.HasValue Then
    q = (From c In model.COMMENT Where startDate.Value <= c.DATEMODIFIED Select c)
Else
    q = (From c In model.COMMENT Select c)
End If

이것이 작동한다면, Where 절이 기존 LINQ 쿼리에 첨부되는 방법에 문제가 있습니다.

여전히 작동하지 않으면 진단하기 위해 수행하는 다음 단계는 Where 절의 코드가 호출되는지 확인하고 해당 코드로 전달 된 값을 확인하는 것입니다. C#에서 할 수있는 것처럼 VB로 라인 내 중단 점을 설정하는 방법을 알 수 없었지만 Lambda를 별도의 기능으로 쉽게 (일시적으로) 리팩터링하고 중단 점을 설정할 수 있습니다. 이와 같이:

Sub Main()
    Dim testDate As Date = New Date(2005, 1, 1)
    Dim x = New List(Of Date?)
    x.Add(New Date(2009, 1, 1))
    x.Add(New Date(2008, 1, 1))
    x.Add(New Date(2007, 1, 1))
    x.Add(New Date(2006, 1, 1))
    x.Add(New Date(2005, 1, 1))
    x.Add(New Date(2004, 1, 1))
    x.Add(New Date(2003, 1, 1))
    x.Add(New Date(2002, 1, 1))
    x.Add(New Date(2001, 1, 1))
    Dim y = From n In x Select n
    y = y.Where(Function(val) test(val, testDate))
    Dim z = y.ToArray()
End Sub

Function test(ByVal date1 As Date, ByVal date2 As Date) As Boolean
    test = date1 >= date2
End Function

비교 함수로 전송되는 값을 확인하십시오. 유효합니까? 비교가 당신이 기대하는 것을 반환합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top