2016-10-21 6 views
3

Entity Framework를 사용하여 데이터베이스를 쿼리하고 있습니다. 결과를 제한하기 위해 Take (1000)를 사용하고 있습니다. 문제는 EF가 1000 개가 넘는 행을 반환하고 # 1000 이후의 모든 엔티티에 올바른 데이터가 없다는 것입니다.Take()가 지정된 것보다 많은 행을 반환하는 이유는 무엇입니까?

이 테이블 구조입니다 :

enter image description here

그리고 쿼리는 다음과 같습니다

var resultListTmp = db.TinglysEjendom.Where(x => x.EjdStatus == description) 
    .Include(x => x.TinglysEjd_ESR.Select(y => y.ESR))    
    .Include(nameof(TingLysMatrikkel)) 
    .Take(amount).AsNoTracking().ToList(); 

# 1000 결국 TinglysEjendom 엔티티는 어떤 TinglysMatrikkel 관계를하지 않아도 문제는, 그러나 그들은 데이터베이스에서합니다.

제거 : 쿼리에서

.Include(x => x.TinglysEjd_ESR.Select(y => y.ESR)) 

는 EF 행의 정확한 수를 반환합니다.

TinglysMatrikkel 테이블의 열 MatrikkelNummer

는 (다른 사람의 사이에) 값을 취할 수 있습니다

는 æ는

å ø 누군가는이 국제화 "국제화 및 현지화"문제가 될 수 있습니다 제안했다. 어떻게 이런 일이 있을지 모르겠다. 어쩌면 누군가가 올바른 방향으로 나를 가리킬 수 있습니까? 사전

LINQ에서

덕분에 위의 쿼리를 번역 :

exec sp_executesql N'SELECT 

[UnionAll1].[EjdId] AS [C1], 

[UnionAll1].[EjdId1] AS [C2], 

[UnionAll1].[EjdType] AS [C3], 

[UnionAll1].[BygningsNr] AS [C4], 

[UnionAll1].[TimeshareNr] AS [C5], 

[UnionAll1].[AnpartsNr] AS [C6], 

[UnionAll1].[EjerLejNr] AS [C7], 

[UnionAll1].[Beskrivelse] AS [C8], 

[UnionAll1].[StreetBuildingIdentifier] AS [C9], 

[UnionAll1].[EjdStatus] AS [C10], 

[UnionAll1].[StatusTimestamp] AS [C11], 

[UnionAll1].[IAbonnement] AS [C12], 

[UnionAll1].[AbonnementOpretAttempts] AS [C13], 

[UnionAll1].[AbonnementsId] AS [C14], 

[UnionAll1].[BestemtFastEjendomsNummer] AS [C15], 

[UnionAll1].[UpdateToken] AS [C16], 

[UnionAll1].[FaellesEjendomIdentifikator] AS [C17], 

[UnionAll1].[C1] AS [C18], 

[UnionAll1].[ESRId] AS [C19], 

[UnionAll1].[ESRId1] AS [C20], 

[UnionAll1].[EjdId2] AS [C21], 

[UnionAll1].[Passiv] AS [C22], 

[UnionAll1].[ESRId2] AS [C23], 

[UnionAll1].[EjdId3] AS [C24], 

[UnionAll1].[ESRId3] AS [C25], 

[UnionAll1].[ESR_Kommune] AS [C26], 

[UnionAll1].[ESR_EjdNummer] AS [C27], 

[UnionAll1].[UdgaaetCognito] AS [C28], 

[UnionAll1].[Status] AS [C29], 

[UnionAll1].[C2] AS [C30], 

[UnionAll1].[C3] AS [C31], 

[UnionAll1].[C4] AS [C32], 

[UnionAll1].[C5] AS [C33] 

FROM (SELECT 

    CASE WHEN ([Join1].[ESRId1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 

    [Limit1].[EjdId] AS [EjdId], 

    [Limit1].[EjdId] AS [EjdId1], 

    [Limit1].[EjdType] AS [EjdType], 

    [Limit1].[BygningsNr] AS [BygningsNr], 

    [Limit1].[TimeshareNr] AS [TimeshareNr], 

    [Limit1].[AnpartsNr] AS [AnpartsNr], 

    [Limit1].[EjerLejNr] AS [EjerLejNr], 

    [Limit1].[Beskrivelse] AS [Beskrivelse], 

    [Limit1].[StreetBuildingIdentifier] AS [StreetBuildingIdentifier], 

    [Limit1].[EjdStatus] AS [EjdStatus], 

    [Limit1].[StatusTimestamp] AS [StatusTimestamp], 

    [Limit1].[IAbonnement] AS [IAbonnement], 

    [Limit1].[AbonnementOpretAttempts] AS [AbonnementOpretAttempts], 

    [Limit1].[AbonnementsId] AS [AbonnementsId], 

    [Limit1].[BestemtFastEjendomsNummer] AS [BestemtFastEjendomsNummer], 

    [Limit1].[UpdateToken] AS [UpdateToken], 

    [Limit1].[FaellesEjendomIdentifikator] AS [FaellesEjendomIdentifikator], 

    [Join1].[ESRId1] AS [ESRId], 

    [Join1].[ESRId1] AS [ESRId1], 

    [Join1].[EjdId] AS [EjdId2], 

    [Join1].[Passiv] AS [Passiv], 

    [Join1].[ESRId1] AS [ESRId2], 

    [Join1].[EjdId] AS [EjdId3], 

    [Join1].[ESRId2] AS [ESRId3], 

    [Join1].[ESR_Kommune] AS [ESR_Kommune], 

    [Join1].[ESR_EjdNummer] AS [ESR_EjdNummer], 

    [Join1].[UdgaaetCognito] AS [UdgaaetCognito], 

    [Join1].[Status] AS [Status], 

    CAST(NULL AS int) AS [C2], 

    CAST(NULL AS varchar(1)) AS [C3], 

    CAST(NULL AS varchar(1)) AS [C4], 

    CAST(NULL AS int) AS [C5] 

    FROM (SELECT TOP (1000) 

     [Extent1].[EjdId] AS [EjdId], 

     [Extent1].[EjdType] AS [EjdType], 

     [Extent1].[BygningsNr] AS [BygningsNr], 

     [Extent1].[TimeshareNr] AS [TimeshareNr], 

     [Extent1].[AnpartsNr] AS [AnpartsNr], 

     [Extent1].[EjerLejNr] AS [EjerLejNr], 

     [Extent1].[Beskrivelse] AS [Beskrivelse], 

     [Extent1].[StreetBuildingIdentifier] AS [StreetBuildingIdentifier], 

     [Extent1].[EjdStatus] AS [EjdStatus], 

     [Extent1].[StatusTimestamp] AS [StatusTimestamp], 

     [Extent1].[IAbonnement] AS [IAbonnement], 

     [Extent1].[AbonnementOpretAttempts] AS [AbonnementOpretAttempts], 

     [Extent1].[AbonnementsId] AS [AbonnementsId], 

     [Extent1].[BestemtFastEjendomsNummer] AS [BestemtFastEjendomsNummer], 

     [Extent1].[UpdateToken] AS [UpdateToken], 

     [Extent1].[FaellesEjendomIdentifikator] AS [FaellesEjendomIdentifikator] 

     FROM [dbo].[TinglysEjendom] AS [Extent1] 

     WHERE [Extent1].[EjdStatus] = @p__linq__0) AS [Limit1] 

    LEFT OUTER JOIN (SELECT [Extent2].[ESRId] AS [ESRId1], [Extent2].[EjdId] AS [EjdId], [Extent2].[Passiv] AS [Passiv], [Extent3].[ESRId] AS [ESRId2], [Extent3].[ESR_Kommune] AS [ESR_Kommune], [Extent3].[ESR_EjdNummer] AS [ESR_EjdNummer], [Extent3].[UdgaaetCognito] AS [UdgaaetCognito], [Extent3].[Status] AS [Status] 

     FROM [dbo].[TinglysEjd_ESR] AS [Extent2] 

     INNER JOIN [dbo].[ESR] AS [Extent3] ON [Extent2].[ESRId] = [Extent3].[ESRId]) AS [Join1] ON [Limit1].[EjdId] = [Join1].[EjdId] 

UNION ALL 

    SELECT 

    2 AS [C1], 

    [Limit2].[EjdId] AS [EjdId], 

    [Limit2].[EjdId] AS [EjdId1], 

    [Limit2].[EjdType] AS [EjdType], 

    [Limit2].[BygningsNr] AS [BygningsNr], 

    [Limit2].[TimeshareNr] AS [TimeshareNr], 

    [Limit2].[AnpartsNr] AS [AnpartsNr], 

    [Limit2].[EjerLejNr] AS [EjerLejNr], 

    [Limit2].[Beskrivelse] AS [Beskrivelse], 

    [Limit2].[StreetBuildingIdentifier] AS [StreetBuildingIdentifier], 

    [Limit2].[EjdStatus] AS [EjdStatus], 

    [Limit2].[StatusTimestamp] AS [StatusTimestamp], 

    [Limit2].[IAbonnement] AS [IAbonnement], 

    [Limit2].[AbonnementOpretAttempts] AS [AbonnementOpretAttempts], 

    [Limit2].[AbonnementsId] AS [AbonnementsId], 

    [Limit2].[BestemtFastEjendomsNummer] AS [BestemtFastEjendomsNummer], 

    [Limit2].[UpdateToken] AS [UpdateToken], 

    [Limit2].[FaellesEjendomIdentifikator] AS [FaellesEjendomIdentifikator], 

    CAST(NULL AS int) AS [C2], 

    CAST(NULL AS int) AS [C3], 

    CAST(NULL AS int) AS [C4], 

    CAST(NULL AS bit) AS [C5], 

    CAST(NULL AS int) AS [C6], 

    CAST(NULL AS int) AS [C7], 

    CAST(NULL AS int) AS [C8], 

    CAST(NULL AS int) AS [C9], 

    CAST(NULL AS int) AS [C10], 

    CAST(NULL AS bit) AS [C11], 

    CAST(NULL AS varchar(1)) AS [C12], 

    [Extent5].[EjdId] AS [EjdId2], 

    [Extent5].[LandsEjerlavKode] AS [LandsEjerlavKode], 

    [Extent5].[MatrikkelNummer] AS [MatrikkelNummer], 

    [Extent5].[EjdId] AS [EjdId3] 

    FROM (SELECT TOP (1000) 

     [Extent4].[EjdId] AS [EjdId], 

     [Extent4].[EjdType] AS [EjdType], 

     [Extent4].[BygningsNr] AS [BygningsNr], 

     [Extent4].[TimeshareNr] AS [TimeshareNr], 

     [Extent4].[AnpartsNr] AS [AnpartsNr], 

     [Extent4].[EjerLejNr] AS [EjerLejNr], 

     [Extent4].[Beskrivelse] AS [Beskrivelse], 

     [Extent4].[StreetBuildingIdentifier] AS [StreetBuildingIdentifier], 

     [Extent4].[EjdStatus] AS [EjdStatus], 

     [Extent4].[StatusTimestamp] AS [StatusTimestamp], 

     [Extent4].[IAbonnement] AS [IAbonnement], 

     [Extent4].[AbonnementOpretAttempts] AS [AbonnementOpretAttempts], 

     [Extent4].[AbonnementsId] AS [AbonnementsId], 

     [Extent4].[BestemtFastEjendomsNummer] AS [BestemtFastEjendomsNummer], 

     [Extent4].[UpdateToken] AS [UpdateToken], 

     [Extent4].[FaellesEjendomIdentifikator] AS [FaellesEjendomIdentifikator] 

     FROM [dbo].[TinglysEjendom] AS [Extent4] 

     WHERE [Extent4].[EjdStatus] = @p__linq__0) AS [Limit2] 

    INNER JOIN [dbo].[TingLysMatrikkel] AS [Extent5] ON [Limit2].[EjdId] = [Extent5].[EjdId]) AS [UnionAll1] 

ORDER BY [UnionAll1].[EjdId1] ASC, [UnionAll1].[C1] ASC',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'HentData' 

답변

2

이것은 C 번호 부분에서 어느 정도 신뢰할 수없는 쿼리 것 같습니다. 즉, 요청한 것을 수행하는 것은 SQL로 변환하는 것이 Entity Framework에 달려 있으며, 그렇게하지 못했습니다. 버그가 아직보고되지 않은 경우보고 할 가치가있을 수 있습니다.

SQL을 자세히 보면 을 합친 TOP (1000)을 사용하는 두 개의 별도 쿼리가 있습니다. 그러나 어떤 쿼리도 ORDER BY을 사용하지 않으므로 SQL Server가 1000 개의 다른 레코드 집합을 선택하지 못합니다. 두 번째 쿼리와 비교하여 쿼리의 첫 번째 부분에 다른 인덱스를 사용할 수 있습니다.

첫 번째 반환하려는 레코드를 지정하면이 문제를 해결할 수 있습니다. 주문에 관심이 없다면 ID로 주문하십시오.

+0

답변 해 주셔서 감사합니다. 쿼리에 ORDER BY를 넣으면 문제가 해결됩니다. 나는 그것을 버그로 신고 할 것이다. – Kenci

+0

관심이있는 경우 TinglysEjendom 테이블에 두 개의 인덱스가 있습니다. # 1 - Non Unique, Non Clustered # 2 - Clustered. – Kenci

관련 문제