DAL hämtar DataTable, DataReader, DataSet, vad man nu vill och ger den till mappern som skapar ett starkt typat objekt.
Det har absolut ingen betydelse vilket objekt som fyller. Saken är den att det måste göras innan du får tillgång till datat.
starkt typade object behöver jag inte veta vad databaskolumnerna heter, objektet har sina attribut istället. Kanske fattade ditt inlägg fel.
Ja du fattar fel. du ser att det står:
dataset.kunder[12].namn
kunder är vad din tabell i databasen heter, 12 är vilken rad i DataTablet(motsvarar raderna i databastabellen), namn är vilken kolumn i tabellen. Detta ordnar intellisensen åt dej. jag behöver heller inte veta vad alla kolumner och tabeller heter.
När jag har en collection av mina objekt kan jag databinda rakt av mot t.ex ett DataGrid. Jag behöver bara plocka ut objektets attribut i griddets ItemTemplate.
Det finns ett lättare sätt, och det heter DataSet, såhär binder jag till ett DataGrid:
DataGrid1.DataSource=dataset.kunder;
DataGrid1.DataBind();
Varför använder du en ItemTemplate när DataGrid:et kan skapa kolumnerna automatiskt med hjälp av DataTablet:s kolumn-schema?.
då det som tar tid är inte skapandet av DataTable/DataSet/Object/Collection av objent.
Utan Databasanropet och transport av data från databaservern till din applicationsserver.
Vi pratar millisekunder och sekunder i detta skede, medans vi pratar mikrosekunder för att skapa och fylla ett objekt.
Om du tex ska ta ut 100 värden ur databasen så måste:
O/R:
Först måste 100 DataRows i DataTable:t skapas och fyllas.
Och efter det måste 100 ytterligare Object i din Collection skapas.
Och sen typkonverteras alla dessa 100 värden innan de läggs in i din Collection, för att annars blir det inte starkt typat.
DataSet:
Först måste 100 DataRows i DataTable:t skapas och fyllas.
Sen typcastas alla dessa värden 100 gånger när man plockar ut värdena till sitt program.
Håller du med?.
Datan i typade datasets ligger i DataTablen och alltså behövs minst 3 operationer för att få ut rätt data och oftas inkluderas en
TypCastning från ett objekt till en ValueType (så kallad boxing/unboxing) och detta är prestandkrävande.
Problemet med ett typat dataset är att detta sker varje gång som man vill hämta ut data. Så vill du hämta ut
Namnet på en kund 4 gånger så görs det alltså 3*4 operationer.
Medans för ett objekt som är fyllt från en O/R Mapper så görs detta endast när objektet fylls med data alltså 1 gång.
Hämtar du 100 värden med din O/R skapar den 100 DataRows + 100 nya Object(till din collection) + 100 typkastningar vid införandet i Collection.
Om man jämför med DataSet: skapa 100 DataRows + 100 typcastningar vid utplockandet av värdena i mitt program.
Skillnaden är bara var typcastningen görs, i O/R fallet: innan den läggs in i Collection, DataSet efter införandet i DataTable.
Men O/R måste också skapa 100 nya object till din collection och fylla dem, vilket inte DataSet:et behöver.
Jag kan inte se prestanda förlusten med dataset.

