[Linq] Paging

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 10-09 03:49
Ik probeer in een listview paging werkend te krijgen, waarbij ik met linq de data uit de database (MSSQL2000) ophaal.

Ik heb een product tabel, een categorie tabel en een koppel tabel ProductCategorie.

De volgende query heb ik gemaakt in linq :

code:
1
2
3
4
 var query = ( from pc in db.ProductCategories
                          where pc.CategorieId == CategorieId
                          orderby pc.ProductId ascending
                          select pc.Product ).Skip( StartRow ).Take( PageSize );


De eerste keer uitvoeren gaat het goed(dan is StartRow nog 0) Maar als ik dan op de next button klik in de listview dan krijg ik de volgende foutmelding:

This provider supports Skip() only over ordered queries returning entities or projections that contain all identity columns, where the query is a single-table (non-join) query, or is a Distinct, Except, Intersect, or Union (not Concat) operation

Ligt het aan mijn 2000 database? Heb ik een fout in mijn query?

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Michel82 schreef op dinsdag 12 augustus 2008 @ 11:24:
Ik probeer in een listview paging werkend te krijgen, waarbij ik met linq de data uit de database (MSSQL2000) ophaal.

Ik heb een product tabel, een categorie tabel en een koppel tabel ProductCategorie.

De volgende query heb ik gemaakt in linq :

code:
1
2
3
4
 var query = ( from pc in db.ProductCategories
                          where pc.CategorieId == CategorieId
                          orderby pc.ProductId ascending
                          select pc.Product ).Skip( StartRow ).Take( PageSize );


De eerste keer uitvoeren gaat het goed(dan is StartRow nog 0) Maar als ik dan op de next button klik in de listview dan krijg ik de volgende foutmelding:

This provider supports Skip() only over ordered queries returning entities or projections that contain all identity columns, where the query is a single-table (non-join) query, or is a Distinct, Except, Intersect, or Union (not Concat) operation

Ligt het aan mijn 2000 database? Heb ik een fout in mijn query?
het probleem is de 'select pc.Product' projectie.
Dat is feitelijk een nested query. Paging over nested queries is niet mogelijk, en geloof me maar dat dat zo is, het feitelijke verhaal is wat lang.

Je moet je query dus omschrijven naar iets wat wel werkt. Nu is het beste te beginnen met wat je feitelijk wilt ophalen, en die set te verkleinen door te filteren.

Je query ziet er in dat licht dan ook niet goed uit. Je wilt products fetchen, maar je gaat met productcategories rommelen, dus dat moet je anders doen:
code:
1
2
3
4
5
 var query = ( from p in db.Products
                    join pc in db.ProductCategories on p.ProductId equals pc.ProductCategories
                    where pc.CategorieId == CategorieId
                    orderby p.ProductId ascending
                   select p ).Skip( StartRow ).Take( PageSize );


Je kunt ook een .Contains query maken, maar Linq to Sql is wat kreupel wat dat aangaat, die geeft soms op bij Contains queries, dus heb ik een join gemaakt.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 10-09 03:49
Bedankt voor je tip, maar ik blijf dezelfde fout houden. Ik heb mijn query aangepast naar :

code:
1
2
3
4
5
  var query = ( from p in db.Products
                          join pc in db.ProductCategories on p.ProductId equals pc.ProductId
                          where pc.CategorieId == CategorieId
                          orderby p.ProductId ascending
                          select p ).Skip( StartRow ).Take( PageSize );

Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 08-09 20:34
is dit niet alleen mogelijk bij een sql 2005 database? zoeits dacht ik wel eens gelezen te hebben

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
bastv schreef op dinsdag 12 augustus 2008 @ 16:35:
is dit niet alleen mogelijk bij een sql 2005 database? zoeits dacht ik wel eens gelezen te hebben
Dat zou idd kunnen, dat het linq to sql team geen paging code heeft ingebouwd voor sqlserver 2000 (met temptables etc.) die meer aankan dan simpele sets zonder filters op related entities. Op zich zou de query gewoon moeten pagen op sqlserver 2000 (mijn linq provider doet het gewoon) maar dan moet de o/r mapper wel paging op sqlserver 2000 met temptables ondersteunen, aangezien paging op sqlserver 2000 niet al te simpel is geimplementeerd (op sqlserver 2005 is het ook nog wat omslachtig overigens)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 10-09 03:49
Het heeft even geduurd, maar ik heb nu sql 2005 en mijn bovengenoemde query werkt nu wel. Het lag dus inderdaad aan de database. Linq lijkt paging naar de mssql 2000 niet te ondersteunen(Maar na wat ik gelezen heb is het inderdaad ook heel veel werk dit voor elkaar te krijgen, in 2005 zijn er wat nieuwe features die paging veel makkelijker maken)

code:
1
2
3
4
5
var query = ( from p in db.Products
                          join pc in db.ProductCategories on p.ProductId equals pc.ProductId
                          where pc.CategorieId == CategorieId
                          orderby p.ProductId ascending
                          select p ).Skip( StartRow ).Take( PageSize );

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Michel82 schreef op maandag 01 september 2008 @ 22:57:
Het heeft even geduurd, maar ik heb nu sql 2005 en mijn bovengenoemde query werkt nu wel. Het lag dus inderdaad aan de database. Linq lijkt paging naar de mssql 2000 niet te ondersteunen(Maar na wat ik gelezen heb is het inderdaad ook heel veel werk dit voor elkaar te krijgen, in 2005 zijn er wat nieuwe features die paging veel makkelijker maken)

code:
1
2
3
4
5
var query = ( from p in db.Products
                          join pc in db.ProductCategories on p.ProductId equals pc.ProductId
                          where pc.CategorieId == CategorieId
                          orderby p.ProductId ascending
                          select p ).Skip( StartRow ).Take( PageSize );
Paging is op sqlserver 2000 echt niet moeilijk hoor. Je moet alleen een temptable met een identity column creeeren en daarin je resultset inserten, tenminste pagesize*pagenumber +1 rows. Dan de query uit de temptable runnen en klaar. Kost nog geen 100 regels code en werkt altijd.

Ik denk dat ze er gewoon geen zin in hadden om het te bouwen voor sqlserver 2000.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1