Celkové počty strán a Entity Framework

0

Otázka

V mojom mobile app, snažím získavať údaje z tabuľky, z mojej databázy servera SQL Server. Ja používam EF a snažím sa používať celkové počty strán pre lepší výkon. Potrebujem na načítanie údajov z posledného prvku v tabuľke. takže ak má tabuľka 20 riadkov, potrebujem, pre stránky, 0, Id 20, 19, 18, 17, 16 potom na strane 1 Id 15, 14, 13, 12, 11 a tak ďalej...

Problém je v tomto: to, čo v prípade, keď užívateľ "A" je sťahovanie údajov z tabuľky, používateľ "B" pridať riadok? Ak sa užívateľ "A" získať Stránku 0 (takže Id 20, 19, 18, 17, 16), a užívateľ "B" v istom okamihu pridať riadok (tak, ID 21), s klasickými dopyt používateľa "A" na stránke 1 dostane Id 16, 15, 14, 13, 12... takže ďalší čas ID 16

Môj kód je veľmi jednoduchý:

int RecordsForPagination = 5; 
var list = _context.NameTable
                   .Where(my_condition)
                   .OrderByDescending(my_condition_for ordering)
                   .Skip (RecordsForPagination * Page)
                   .Take (RecordsForPagination)
                   .ToList();

Samozrejme Page je int, ktoré pochádzajú z frontend.

Ako to môžem vyriešiť problém?

Našiel som riešenie, ale neviem, či je to dokonalé. Mohol by som použiť

.SkipWhile(x => x.ID >= LastID) 

namiesto

.Skip (RecordsForPagination * Page)

a samozrejme LastID vždy je odoslaná z frontendu.

Myslíte si, že výkon je vždy dobré s týmto kódom? Existuje lepšie riešenie?

entity-framework linq sql-server
2021-11-22 23:06:34
1

Najlepšiu odpoveď

1

Výkon vplyvov bude do veľkej miery závisieť na vašej SQL Index implementácie a poradie podľa doložky. Ale nie toľko otázku o výkonnosti, ako to je o tom, ako očakávané výsledky.

Pretečenie zásobníka je skvelý príklad, kde je objem činnosť tak, že keď sa dostanete na koniec žiadne stránky, ďalšia stránka môže obsahovať záznamy z stránke si len pozrieť, pretože základné záznamov zmenilo (ďalšie príspevky boli pridané)

Som to vytiahla, pretože v live systém je všeobecne známe, a v niektorých prípadoch je očakávané správanie. Ako vývojári vážime pridané režijné snaží udržiavať jediný výsledok, a uvedomujeme si, že tam je zvyčajne oveľa nižšiu hodnotu v snaží zabrániť, čo vyzerá ako duplicity , ako budete opakovať stránky.

To je často dosť vysvetliť užívateľov, prečo k tomu dochádza v mnohých prípadoch sa budú akceptovať to

Ak to bolo pre vás dôležité udržiavať miesto v pôvodnej výsledok, potom by ste mali obmedziť dotaz s Where doložka, ale budete si musieť vybrať buď Id alebo timestamp v pôvodnom dotaz. Vo vašom prípade sa pokúšate použiť LastID,, ale ak chcete získať posledný ID by si vyžadujú samostatné dotaz na to vlastné, pretože orderby ustanovenie bude mať vplyv na to.

Nemôžete naozaj použitie .SkipWhile(x => x.ID >= LastID) pre toto, pretože preskočiť je postupný proces, ktorý je ovplyvnený poriadku a je dis-zaoberá prvého stupňa, že výraz vyhodnotí false,, takže, ak vaša objednávka nie je založený na Idváš preskočiť, zatiaľ čo môže spôsobiť, je skákanie žiadne záznamy vôbec.

int RecordsForPagination = 5; 
int? MaxId = null;
...
var query = _context.NameTable.Where(my_condition);
// We need the Id to constraint the original search
if (!MaxId.HasValue)
    MaxId = query.Max(x => x.ID);

var list = query.Where(x => x.ID <= MaxId)
                .OrderByDescending(my_condition_for ordering)
                .Skip(RecordsForPagination * Page)
                .Take(RecordsForPagination);
                .ToList();

Vo všeobecnosti je však jednoduchšie filtrovať podľa bodu v čase, ako je to známe z objednávateľa bez kolo výlet do DB, ale v závislosti na implementácii filtrovanie na dáta môže byť menej efektívne.

2021-11-22 23:55:04

Môj zámer nebol prevziať LastID z DB (pretože, ako ste povedal, to by bolo ovplyvnené Db sám). môj zámer bol tento: - Frontend načítať Stránku 0 a výsledok je Id 20, 19, 18, 17, 16 - Rozhranie načítať Stránku 1 a odovzdať slovník dve param: Strana 1 a LastID z predchádzajúcej Strane (v tomto prípade LastID = 16) -> takže výsledok bude Id 15, 14, 13, 12, 11... a tak ďalej. moja angličtina nie je dokonalá,... sú nám hovorí to isté?
user1106897

@user1106897 technika Chris týka sa nazýva Kľúčov celkové počty strána je vo všeobecnosti oveľa lepšie ako stránkovacieho tým, že riadky, čo je to, čo hovoríte
Charlieface

Je veľmi veľa je aj otázka výkon: stránkovací podľa riadkov je vysoko neefektívne ako všetky predchádzajúce riadky treba čítať každý čas. Keďže stránkovacieho podľa kľúča (alebo čas, v tomto prípade) je vysoko efektívne, ak je podpora index
Charlieface

Charlie tvár ďakujem za odkaz, naozaj ocenia. Budem sa snažiť použiť rady
user1106897

Vďaka @Charlieface výkon poznámka bol viac mali "zabudnúť na výkon, SkipWhile(prostredníctvom id) nebude riešiť problém, ak zmeníte poradie" Veľký odkaz príliš!
Chris Schaller

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................