Laden...

Entity Framework 6.1.2, SQL Server 2012 Express, Paging bzw Offset Problem

Erstellt von ZeroQool vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.032 Views
Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 9 Jahren
Entity Framework 6.1.2, SQL Server 2012 Express, Paging bzw Offset Problem

verwendetes Datenbanksystem: SQL Server 2012 Express

Hallo zusammen,

ich benutze gerade in einem neuen Projekt die aktuelle EF Version 6.1.2 u bei der Implementierung von PagedList ist mir aufgefallen, dass das Paging nicht sauber funktioniert. Einträge kamen immer wieder vor...

Nun habe ich mir im Debug das generierte SQL angeguckt und in das Management Studio geladen

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
    [Extent1].[PasswordHash] AS [PasswordHash], 
    [Extent1].[SecurityStamp] AS [SecurityStamp], 
    [Extent1].[PhoneNumber] AS [PhoneNumber], 
    [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
    [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
    [Extent1].[UserName] AS [UserName], 
    [Extent1].[SalutationId] AS [SalutationId], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[EmployeeId] AS [EmployeeId]
    FROM [dbo].[AspNetUsers] AS [Extent1]
    ORDER BY [Extent1].[LastName] DESC
    OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY ;

Nun verändere ich den Offset Wert zb auf 2 und ich erhalte immer noch exakt die gleichen 2 Ergebnisse wie zuvor mit der 1. Das gleiche Spielchen zieht sich bis zum Wert 13, wobei zu erwähnen ist das die TotalRows nur 15 sind.

Den einzigen Workaround den ich gefunden habe ist in der EDMX den Wert 2012 auf 2008 (ProviderManifestToken) abzuändern, aber das kann nicht wirklich die Lösung sein. Zumindestens hätte die SQL Anweisung meiner Meinung nach im Management Studio funktionieren müssen.

Danke

16.830 Beiträge seit 2008
vor 9 Jahren

Irgendwo ein ToList dazwischen? Dann funktioniert PagedList nicht mehr.

Ich benutze daher folgendes Snippet:


 public static IQueryable< TEntity > ToPagedQuery< TEntity >( this IQueryable< TEntity > query, int pageSize, int pageNumber ) {
        return query.Skip( pageSize * ( pageNumber - 1 ) ).Take( pageSize );
    }

Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 9 Jahren

Ja, ist korrekt.

Bin sogar mittlerweile bei einer alternativ-Lösung, aber das Problem ist weiterhin vorhanden.

result.Entities = data.AsQueryable()
                                          .Skip((paging.PageNumber - 1) * paging.PageSize)
                                          .Take(paging.PageSize)
                                          .AsQueryable();

Ich bin mir sicher es liegt am generiten SQL vom EF. Wenn man auf den 2008 Modus schaltet wird kein OFFSET SQL generiert sondern ein:

 TOP(1)....[Extent1].[row_number] > 2
16.830 Beiträge seit 2008
vor 9 Jahren

OFFSET ist eine schnellere Variante als mit dem Vergleich.
Ist ein neues Schlüsselwort ab SQL Server 2012. Logisch, dass das bei 2008 anders aussehen muss...

Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 9 Jahren

Das ist mir schon klar, dass das anders aussieht, aber wie gesagt es ist auf 2012 eingestellt gewesen u ich habe einen 2012 SQL Server, aber der Befehl funkioniert nicht wie er es eigentl. sollte u ich denke es liegt nicht daran, dass es eine Express Version ist.

T
50 Beiträge seit 2010
vor 9 Jahren

Prüfe doch mal, welches Kompatibilitätslevel Deine Datenbank hat. Wenn die von einer älteren Datenbank migriert wurde, dann kann es sein, dass sie die Funktionen nur der alten Version unterstützt. Du kannst das Kompatibilitätslevel über die Eigenschaften der Datenbank verändern.

Keine Garantie, dass es das tatsächlich ist.

Gruß,
Ronny