citat:
--------------------------------------------------------------------------------
Efterdet så måste du typcasta ditt värde till rätt typ:
((int)(this[this.tableelement1.TransactionIdColumn]));
--------------------------------------------------------------------------------
Du tycks ha glömt att din O/R mapper fyller ett DataTable från databasen, och från DataTable:t fyller den en Collection, det handlar alltså om 2 feta objekt som måste fyllas innan du har tillgång till dina data. När det handlar om dataset så fylls BARA DataTablet och inget mer, alltså bara 1 objekt, DataSet-DataTables gör hälften av vad O/R mappern gör, därav går det snabbare.
Nu prata vi helt två skilda saker här:
Jag pratar om att hämta ut värden från ett Typat DataSet som redan har all data inladdad.
Du pratar om att ladda in data i mina collections av objekt.
Eftersom det typade Datasetet inte fungerar som jag trodde så kan jag hålla med dig om att det går fortare att ladda ett DataSet med data än collections av object med O/R Mapper.
MEN MEN MEN.
Eftersom det typade datasetet inte fungerar som jag trodde så blir prestandan när det används så mycket sämre än vanliga objekt. Så här fungerar det nämligen.
1. Både DataSetet och O/RMappern får en DataTable från DAL:et (ingen av dem fyller en DataTable (vi borde snart kunna vara överens om detta tycker jag)). Och här kommer skillnaderna.
DataSetet lägger in DataTablen i en collection av något slag(säkert en HashTable) och sedan är den färdig.
O/R Mappern måste loppa igenom DataTablen och hämta ut datan, skapa ett objekt och sedan fylla detta objekt med data. Detta tar längre tid än att bara stoppa DataTablen i ett DataSet.
Denna skillnad är dock nästan försummbar 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. Alltså kommer den slutliga prestanda skillnaden var extremt liten.
2. Vi har nu ett Typat DataSet som innehåller en DataTable med data, och vi har Collections av object som innehåller data.
Datan i ett objekt finns redan lagrat i sina rätta variabler, alltså behövs ingen vidare bearbetning för att få ut rätt data.
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.
Detta betyder att det tar längre tid att ladda in storamängder data via en O/R Mapper än via ett typat DataSet, återigen så är denna tid iprincip försumbar eftersom den största tiden läggs på att hämta data från Databasen och inte skapandet av objekt. Igengäld så är prestandavinsterna större när man väl skall använda datan, eftersom datan redan finns i rätt format, och man slipper söka efterden i ett DataTable.
man behöver andra snabbare objekt som är skapta enbart för sådana här saker, och det är dom objekten vi kommer få se i ADO.NET2.0.
Om man inte har byggt in stöd för att lagra objekt i Yukon, alltså en objektorienterad databas istället för relationsorienterad, så kommer ObjectSpacer som kommer i ADO.NET 2.0 fungera på samma sätt som O/R Mappers fungerar idag.
Och har man byggt in stöd för OO databas, så behöver man ingen O/R Mapper eftersom den då har flyttats in i databasen. Matrise (tror jag den heter) är en objeckt orienterad databas som har stöd för .NET. Där kan man hämta och spara object direkt ner mot database, vilket gör att "O/R Mappern har flyttats in i databasen"
Vilken O/R mapper använder du?.
Min egen som jag har knåppat ihop.
- M