Redusere kompleksitet i Entity Framework spørringer Skrevet av Tore Aurstad, 23.11.2014 1.

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Hans Olav Norheim
C++ for Java-programmerere
JSP presentasjon Arild Strømhylden NTNU 26 June 2014.
Høgskolen i Oslo Webprogrammering SQL og databaser del 3.
Visma KGV (Konkurranse Gjennomføring Verktøy)
Sikkerhet - bakgrunn og introduksjon til kryptosystemer
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Tips og triks Strukturering av større applikasjoner Automatiserte tester. Kristian Johannessen
EcmaScript 5 Arrays Demonstrasjon av ny funksjonalitet støttet i IE 9.
Databasehåndtering med MySQL
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
Aksess kontroll None shall pass.
1 Øvingsforelesning Andreas Knudsen Nils Grimsmo
En gang til!? .
Om øvelse 9 Vedlikehold av data Databaser. Øvelse 9 I øvelse 8 så vi på: –Registrering av informasjon om hjelpere To små utvidelser av øvelse 8: –Endring.
WiPro et samarbeid mellom: Studenter: Veileder: Oppdragsgiver:
Løsning hos RSH Norge En gjennomgang av løsning hos Reitan Servicehandel Norge Edvard Gundersen – ProfitBase AS Løsningsarkitekt.
1 Kap 08 Kø. 2 Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes.
Design Patterns Iterator & Mediator. Gruppe 8 Presentasjonsgruppe:Resten av gruppen: Marianne AtesAndrè Johansen Tom Vidar LundeHege-Kristin Johansen.
Singleton & Adapter Pattern Gruppe 3. Singleton Pattern Sørger for at en klasse kun kan ha en instans Vanligvis implementert med globale variabler –Singleton.
Teknikker for å bedre design- prosessen -Design by contract -Prototyping design -Fault-tree analyses.
Improving Products Gruppe Presenteres av : Hege-Kristin Johansen Herman Kolås Marianne Ates Marit Finden Jonas Lillevold André Johansen Tom.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Oversikt Den delen av Standard C++ Library som tidligere var STL Konsepter i STL: –Iteratorer –Samlinger (containers) –Algoritmer –Funksjonsobjekter.
1 Organisering av kode (Kapittel 5). 2 Mål ● Forstå inkludering er og hvilken gevinst det gir ● Lære å utvikle egne funksjoner ● Forstå variablenes virkemåte.
Høgskolen i Oslo Webprogrammering Filbehandling i PHP.
Høgskolen i Oslo Webprogrammering Ajax og PHP. I dag l Hvordan få en bedre brukeropplevelse via Ajax- script l Gjennomgang av kode l Oppgaveløsning på.
Høgskolen i Oslo Webprogrammering Java-scripting 2 Klientvalidering.
Stringmanipulasjon, RegEx og validering
Criteria Når og hvorfor bruke Criteria i Hibernate.
Implementering av caching ved hjelp av Spring Christian Vestøl
Eksempel på SQL ”SQL-setninger” har en struktur som likner på ”naturlig språk”, med ”verb, subjekter og adjektiver”. SQL-setningene begynner alltid med.
Evaluering ”Studentene har talt, men hva har de sagt?”
PARLAY/OSA Referanser: Referanser Foredraget er i all hovedsak basert på to artikler. Disse kan finnes på:
Andre funksjoner. Her kommer en beskrivelse av søkefunksjoner, knapper og annen funksjonalitet. 2.
OOT Seminar H-97 CORBA Praktisk del. Valg av ORB implementasjon n Har valgt å bruke Visigenic sin ORB implementsjon n ORB’en er 100% Java kodet n Bygger.
Linq To SQL Fagdag 20. November DataContext  DataContexten er mappingen mot databasen –Generer objekter for alle entiteter (tabeller), med properties.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 18.9 Lesing av data fra fil og skriving av data til fil. Side 411 – 4.. Kap 4.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
© UNIVERSITETETS SENTER FOR INFORMASJONSTEKNOLOGI UNIVERSITETET I OSLO USIT Side 1 Installering av Windows XP med PXE (netboot) Del 1 – forhåndskonfigurering.
Praktiske erfaringer med Objektorientert Progress og.NET Jan Kolstad PUG Norway, Lillehammer 2005.
TOA 21. nov.Side 1Divisjon Informasjonsteknologi WinMap produktene Status og nyheter Tor Olav Almås Avdelingsleder NOIS.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
Hallgrim2LF : Hva Hva skal metoden traverser gjøre?  Ta inn et rom som parameter  Returnere antall møter i dette rommet og i alle rom innenfor. Public.
1 Java Database Connectivity (JDBC) Norvald H. Ryeng
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Indledende Datalogi /kelk 1 Need to know Løkker Klasser, instanser og Objekter Hvorfor objektorientering? Scope – hvor erklæres en variabel? ”Access Modifiers”
Telenors satsing på fri programvare Paul Skrede - GoOpen 2009.
Informasjonssystem for tannlege Kloster-Jensen
GSV – Generic Storage and Validation Hovedprosjekt 2004/2005 Oppgave 10E Trond Smaavik
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Masteroppgave Administrasjonsmoduler til eAccess.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Klasse: 2HKI Student: Bertil Gjerstad Oppgnr: 25E
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Mer avansert kryptering Mål: Kode et dokument slik at det blir uleselig for de som ikke har kodenøkkelen.
Finne feil - Debugging Introduksjon til sortering.
Kapittel 4 Skriving av klasser. 4.1 Anatomien til ein klasse Så langt har vi brukt ferdige klasser frå klassebiblioteket i Java Vi lagar objekt og brukar.
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Android-Programmering Våren Oversikt Long-running operasjoner Introduksjon til Android services On-demand service Bruk av servicer på tvers av prosesser.
BilSalg klassedatastruktur Bil klassedatastruktur
Behind the scene Anders Hattestad ,
Dataanalyse CanSat.
BilSalg klassedatastruktur Bil klassedatastruktur
Utskrift av presentasjonen:

Redusere kompleksitet i Entity Framework spørringer Skrevet av Tore Aurstad,

Redusering av kompleksitet i EF- spørringer En utfordring med Entity Framework er at spørringer i produksjonskode blir kompleks rett og slett fordi det er nødvendig. Det som ikke er nødvendig er å beholde all kode for EF- spørringer i en enkelt, monolittisk metode og spørring. Ulike teknikker for å dekomponere, forenkle og refaktorere EF- kode for å forenkle EF-spørringer vil presenteres her. 2

Chaining av EF-spørringer med IQueryable [1/3] Reduksjon av kompleksitet i EF-spørringer er mulig ved å tilby filtermetoder på entiteter som returnerer IQueryable av type T. Det er mulig å chaine slike filtermetoder. Metodene man lager bør være static for å støtte dette. Eksempel: private static IQueryable GetOperationsQueryableWithTracking(IOpPlanDataContext context, OperationsRequestDataContract request, int status, bool isOperationScheduleStatus) { var operations = context.Operations.Where(o => (isOperationScheduleStatus ? context.TheaterOperationalUnitLinks.Any(x => x.FreshOrganizationalUnitId == requ est.FreshId && x.TheaterId == o.TheaterId) : o.OperationalUnitId == request.FreshId) && (o.Status != (int)OperationStatusDataContract.None && ((status & o.Status) == o.Status)) || (request.AllowStatusSetToNone && request.Status == OperationStatusDataContract.None)); operations = FilterByTheaterId(request, operations); operations = FilterByOperatingDate(request, operations); return operations; } 3

Chaining av EF-spørringer med IQueryable [2/3] private static IQueryable FilterByTheaterId( OperationsRequestDataContract request, IQueryable operations) { if (request.TheaterIds != null && request.TheaterIds.Count() > 0) { operations = operations.Where(o => request.TheaterIds.Contains(o.TheaterId)); } return operations; } private static IQueryable FilterByOperatingDate(OperationsRequestDataContract request, IQueryable operations) { if (request.FromOperatingDate.HasValue && request.ToOperatingDate.HasValue) { var fromDate = request.FromOperatingDate.Value.StartOfDay(); var toDate = request.ToOperatingDate.Value.EndOfDay(); operations = operations.Where(o => (o.OperatingDate >= fromDate && o.OperatingDate <= toDate) || o.Status == (int)OperationStatusDataContract.Urgent); } return operations; } 4

Chaining av EF-spørringer med IQueryable Bemerk at når man filtrer en entitet på denne måten gjentatte ganger blir ikke spørringer kjørt umiddelbart. Akkurat som i LINQ to Objects så er det slik i EF, som har dialekten LINQ to Entities, ikke en kjøring av spørringene før man enumerer spørringene. En slik enumerering skjer typisk når man brukes ToList(), ToArray(), ToDictionary() eller gjør en foreach. Hvis man har en kompleks spørring kan man gjør ulike filtreringer for å forenkle den komplekse spørringen. I spørringen i dette eksempelet er det mulig å refaktorere videre ved å flytte et av predikatene ut til en egen metode. LINQ to Entities forbyr metodekall inne i selve spørringene, men det er likevel mulig med å bruke LinqKit 5

Linqkit Med LinqKit kan man bruke metodekall inne i query syntaxen til spørringer. Dette gjør det mulig å gjenbruke funksjonalitet i EF, akkurat som filtreringsmetoder som returnerer IQueryable. LinqKit er tilgjengelig som NuGet pakke og kan installeres enkelt i en Visual Studio løsning: Install-Package LinqKit I stedet for å returnere IQueryable, vil metodene man legger til hvor man skiller ut logikk i egen predikatmetode returnere Expression >. Linqkit har mer funksjonalitet enn det som presenteres her. Linqkit er laget av Joseph Albahari, som også har laget LinqPad. Linqpad er nyttig for å jobbe med EF spørringer. Det reduserer debug syklusen og lar en også se SQL-en som genereres av EF. Det er også mulig å jobbe med LinqKit inne i Linqpad

Eksempel på spørring i LinqPad som bruker LinqKit inne i LinqPad private Expression > IsOperationInSharedTheaterOrOwned(int freshId) { var predicate = PredicateBuilder.False (); predicate = predicate.Or(o => (o.OperationalUnitId == freshId) || (TheaterOperationalUnitLinks.Any(tou => tou.FreshOrganizationalUnitId == freshId && tou.TheaterId == o.TheaterId) && o.Theater.OperationalUnits.Any(tou => tou.FreshOrganizationalUnitId == freshId))); return predicate; } void Main() { var startTimeWindow = new DateTime(2014,5, 24).StartOfDay(); var endTimeWindow = new DateTime(2014,5, 24).EndOfDay(); var currentOperationalUnitFreshId = ; var operations = from operation in Operations.AsExpandable().Where(IsOperationInSharedTheaterOrOwned(currentOperationalUnitFreshId)) where operation.Status != (int)OperationStatusDataContract.Deleted && operation.OperatingDate >= startTimeWindow && operation.OperatingDate <= endTimeWindow from patient in Patients where patient.OperationId == operation.OperationId select new { operation.OperationId, operation.Status, operation.OperatingDate, patient.Name,patient.OfficialId}; operations.Dump(); } 7

Eksempel på spørring i Linqpad som bruker Linqkit I spørringen i eksempelet så benyttes metoden.AsExpandable() slik at man kan benytte Linqkit sine utvidelsesmuligheter som muliggjør metodekall inne i query syntaxen. Metoden man kaller bruker Where og selve metoden, som returnerer Expression >. I tillegg benyttes PredicateBuilder i Linqkit som initielt settes til false. Nå kan man inne i metoden bruke.Or() metoden i Linqkit og implementere predikatet. Linqkit kan brukes i Linqpad ved å legge til en referanse til Linqkit.dll- en og navnerommet Linqkit. Kryss også bort Include Predicatebuilder i Linqpad options (F4). I kodeeksemplet så er koden kjørt inne i LinqPad. Her er context implisitt og ikke i koden. I tillegg så vil metoden for predikatet være static i produksjonskode, men i Linqpad er det ikke static modifier her. Dump() metoden i Linqpad sender resultatet ut i GUI-et til Linqpad. 8

Linqpad skjermbilde 9

Linqpad og SQL-visning 10

Oppsummering Entity Framework har støtte for å dekomponere spørringer ved å returnere IQueryable i spørringer. Når man returnerer IQueryable kjører ikke spørringene før man enumerer resultatet, altså ikke umiddelbart. Med Linqkit kan man flytte kode i EF-spørringer ut i egne metoder og gjenbruke funksjonalitet. Ofte så vil man ende opp med monolittisk kode i Entity Framework hvor mye logikk skrives, som i for eksempel rapportspørringer. I denne presentasjon har det blitt presentert to ulike teknikker som lar en gjenbruke kode i EF, noe som både lar en redusere kompleksiteten, men også raskere lage funksjonalitet, ved gjenbruk i seg selv. 11

Separation of Concern Husk at en metode skal i utgangspunktet gjøre kun en ting! Med de to teknikkene presentert her kan man i alle fall redusere kompleksiteten. Veldig mye av koden man skriver i Hemit er faktisk i datalaget og sjonglering logikk på entieter i Entity Framework. Jo bedre man blir til å kode EF, jo mindre kåbåikode ender man opp med og jo enklere blir vedlikeholdet, samt lesbarheten i koden økes. En EF-metode som knapt får plass på en A4 side er ikke uvanlige i løsninger. Ofte skriver man også den samme koden igjen, fordi vanlig EF ikke tillater metodekall inne i queryen, men med Linqkit er det lov. EF kode kan ofte brukes feil. Bruk gjerne Linqpad og sjekk at spørringene man lager ikke kjører tregt eller henter ut mye data. SQL Server Profiler er også nyttig verktøy. 12

That’s all folks! 13