Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Linq] Variabel aantal filters toepassen op query

Pagina: 1
Acties:

  • Jeroen
  • Registratie: Juli 2005
  • Laatst online: 20-11 18:26

Jeroen

uǝʌ ǝp uɐʌ

Topicstarter
Ik ben bezig met een systeem wat afhankelijk van de situatie een vergelijkbare set data moet querien, maar met verschillende filters. Die filters worden door een aantal verschillende methodes beinvloed en dan na de query uiteindelijk toegepast op volgorde. Dit is mijn oplossing daarvoor:

code:
1
2
3
4
5
6
7
8
9
    <Extension>
    Public Function Filter(Of T As Class)(query As IQueryable(Of T), filters As Stack(Of String)) As IQueryable(Of T)
        Dim sfilter As String
        While filters.Count > 0
            sfilter = filters.Pop()
            query = query.Where(sfilter)
        End While
        Return query
    End Function


Dit wordt aangeroepen op een query op ongeveer deze manier:

code:
1
activitiesData = activitiesData.Filter(filters).OrderBy(sortString).Skip(skip).Take(take).ToList()


Nu heb ik niet zo veel ervaring met linq, dus ik vraag me af of hier nog performance issues aan te zien zijn. Het aantal filters zal denk ik nooit groter worden dan ~10, maar het liefst wordt de query zo snel mogelijk samengesteld en uitgespuugd. Deugt deze code?

"I don't always test my code, but when I do, I test on production."


  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 12-11 09:07
Hmm een lijst met filters maken en dan eem constructie zoiets als:
filters.foreach(f => query.where(f));

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 21-11 14:26

Haan

dotnetter

Ik heb hiervoor weleens LinqKit gebruikt. Dat was voor een zoekpagina waar je een stuk of tien filters in kon stellen. Met de LinqKit kan je op een vrij eenvoudige manier dynamisch je query opbouwen. Ik meen me wel te herinneren dat er onder water een gedrocht aan SQL uit kwam, dus kijk wel even kritisch naar performance e.d.

Kater? Eerst water, de rest komt later


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 11:29
En dynamic LINQ? Dat je letterlijk je query mee geeft? Is dat een optie?

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Nibble schreef op woensdag 28 mei 2014 @ 13:22:
Hmm een lijst met filters maken en dan eem constructie zoiets als:
filters.foreach(f => query.where(f));
Dat is wat hij nu al doet....

OT: Of er performance issues aan zitten is maar op 1 manier te bepalen: meten. Ik denk dat de vraag iets te specifiek is om hier een generiek antwoord neer te zetten. Bijvoorbeeld: Gaat dit over een in memory data set? Of een database? Als het een database is komt het neer op beschikbaar geheugen en goede indexes. Daarnaast weten we ook niet hoe veel queries het systeem te verwerken krijgt.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is inderdaad heel erg afhankelijk van wat je precies wil doen ( En dus vooral wat voor IQueryable het is ). In feite ben je gewoon een expression tree aan het opbouwen, en dat zal doorgaans niet zoveel performance problemen geven ( Ik neem aan dat je het niet duizenden keren per seconden doet ;) ).

Het is pas op het moment van evalueren van de query dat er daadwerkelijk wat mee gedaan wordt. In het geval van Entity Framework o.i.d. zal er dus gewoon een SQL query uitrollen, en je zult dus moeten kijken of die query acceptabel is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Jeroen
  • Registratie: Juli 2005
  • Laatst online: 20-11 18:26

Jeroen

uǝʌ ǝp uɐʌ

Topicstarter
Bedankt voor de input, ik begrijp steeds beter waar in de code er SQL wordt opgebouwd en waar die wordt uitgevoerd, en ik denk dat er hier gewoon nog SQL wordt opgebouwd en het dus niet zo veel uitmaakt hoe dat gebeurt.

"I don't always test my code, but when I do, I test on production."


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In principe zal er pas SQL uitgevoerd worden op het moment dat er een ToList()/ToArray()/Single()/First()/Count()/GetEnumerator()/etc. aangeroepen wordt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1