Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Entity Framework 6.1.2, SQL Server 2012 Express, Paging bzw Offset Problem
ZeroQool
myCSharp.de - Member



Dabei seit:
Beiträge: 322

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ZeroQool am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

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 );
    }
private Nachricht | Beiträge des Benutzers
ZeroQool
myCSharp.de - Member



Dabei seit:
Beiträge: 322

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ZeroQool am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
ZeroQool
myCSharp.de - Member



Dabei seit:
Beiträge: 322

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 43
Herkunft: Bayern

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers