Vet inte om detta är rätt grupp av forum. Men jag hittade inget annat, så jag gör ett försök. <b>I klassen kund har jag ju en klass för att hämta en specifik kund, inte alla tex.</b> Hej Förstår inte riktigt, kan du utveckla detta; skapa ett nytt objekt som representerar vyn, som du sedan laddar från databasen. Hej Hej, Hjälp med objektorienterat tänk
Har ett projekt som jag håller på att bygga objektorienterat. Jag har koll på hur man skapar klasser och dess egenskaper och metoder. Men en sak som jag ofta stöter på är när jag ska hämta data från flera tabeller i databasen.
Exempel på db: kund -> orderrad(kopplingstabell) <- artikel -> levart -> leverantör
Exempel på data jag vill hämta: vill kunna visa data vilka artiklar varje kund beställt och från vilka leverantörer dessa artiklar kommer från.
Hur löser jag detta bäst objektorienterat för att hämta denna info? Känns fel att ha en klass som hämtar all data genom en sql-sats. I detta exempel måste jag hämta från 5 tabeller. I klassen kund har jag ju en klass för att hämta en specifik kund, inte alla tex.
Jag vill sen smidigt kunna loopa igenom data för att presentera informationen.Sv: Hjälp med objektorienterat tänk
vad menar u med det det? Har du en metod på kundobjektet som hämtar/sparar en kund och isåfall varför det? En klass bör ju bara innehålla de attribut som behövs för klassen, CRUD bör skötas av en manager, den tar hand om allt, tex läsa upp en kund eller läsa upp en collection av kunder.Sv:Hjälp med objektorienterat tänk
Varför inte skapa ett nytt objekt som representerar vyn, som du sedan laddar från databasen. Sv: Hjälp med objektorienterat tänk
Menar du att jag har en vy i db som hämtar denna info, och via en klass skapar jag ett objekt som utför detta?Sv:Hjälp med objektorienterat tänk
Du har behov att visa en vy som innehåller informationen från flera olika domänobjekt, order, summering av orderrader, leverantörer. Skapa ett vyobjekt som hämtar allt genom en sqlfråga alternativt så låter du denna manager klass använda din vanliga dataaccess klasser (repositories, managers). Berorende på vilka krav du har (prestanda, arkitektur) så kan du lösa det hur du vill. Detta vyobjekt som du skapar bör vara read-only, inte innehålla någon affärslogik, det skall inte gå att editera det och spara ner det till databasen.
Jag ser inga problem med detta ur ett objektorienterat tänk. Sv: Hjälp med objektorienterat tänk
Normalt sätt har du ju en Order som har en kund, din Order har OrderRader som har artiklar
som har en leverantör om det nu är viktigt att ha en leverantör om det måste vara med.
Jag skulle då gjort en OrderRepository som har en metod som hämtar en Order baserad på en kund.
Order order = OrderRepository.LoadByCustomer(customer);
Vad OrderRepository sedan gör är att skapa Order objektet sedan koppa på de OrderLines o dess artiklar och artikelns leverantör.
Detta kan ske antingen via Join sats eller att du gör flera selects. Du får testa lite ang prestanda här för det är inte alltid en join är snabbare än 3 select satser bara för att en join ger en databasfråga.
I Ett projekt som jag har gjort så laddar jag först in min Order baserad på kund fyller denna.
Sen tar jag mitt OrderNummer och slår upp alla Orderrader som har detta nummer och skapar en collection av OrderRader där jag sedan för varje OrderRads ArtikelID slår upp dess artikel och fyller dessa.
Anropen här kan bli många, men då mitt system inte är så kritiskt spelar dessa anrop ingen större roll, viktigast är att få systemet att fungera. Därefter optimerar jag om kraven inte kan uppfyllas, dvs omd et tar för lång tid. Då kan man antingen ha cache mot en ID MAPPER typ en singleton klass Hashtabel i botten eller stack eller nått där man melanlagrar objekt som man hämtar eller sparar som man först går mot innan man går mot DB för att se om objektet redan är inläst o fyllt. Detta spar massa datakraft och tid... Sedan kan man ev dra ner på vissa selects med joins o testa om det ger ökad prestanda. Ex kanske du kan få fram all data för ditt OrderLine objekt och Artikle samt Leverantörns objekt i en enda Select istället för att göra flera anrop. Men det är farligt att experimentera öfr mkt med prestanda med en gång,,, normalt lägger folk ner 80% av sin tid på att optimera kod i onödan. Så först do it simple, få det att fungera. Sedan testa och optimera om kravet inte uppfylls.
Order
|---------OrderLines (collection av typen OrderLine)
|----------------------------OrderLine
|------------ Article
|------------- Supplier
Mvh Johan