LINQ i alla dess smaker Johan Lindfors blogs.msdn.com/johanl Patrik Löwendahl
Agenda Vad är utmaningen – Otypade och typade dataset, TableAdapter – Utmaningar och alternativ Microsofts ansats – LINQ to Objects LINQ to SQL – LINQ to Entity Framework Lite utanför ”området”... – LINQ to XML – ”Astoria”
Bakgrund och utmaningar
DataSetDataTable DataReaderRepositories Domain Model Objekts modell Data Transfer Object Message Object Active Record XML
!!
ADO.NET ADO.NET
DataTable DataSet
EmployeesOrdersCustomersProductsCategories Products SqlDataAdapterOleDbDataAdapter SQL Server 2005 CustomersOrders SQL Server 6.5 DataSet Web service XmlDataDocument XML Fil
För- och nackdelar +- Snabbt att komma igångBegränsad ”change tracking” Enhetlig datamodellIngen ”Lazy Loading” Bra interface mot databasenBidrar till att skapa procedurella lösningar Grundläggande CRUDFå utökningspunkter Enhetlig syn på data med databasen Hård koppling mellan applikation och databasstruktur
Domänmodeller Domänmodeller
Fokus på applikation inte lagring Frikopplar affärslogik från datastrukturen Större möjligheter till återanvändning och utökningar
Tjänster Lazy LoadingLaddar data ”on demand” Avancerad change trackingSpårar förändringar på fältnivå Inverse managementAutomatisk hantering av hiearkiska relationer Uniquing (Identity Map)Säkerställer att bara en kopia av varje entitet finns i minnet. CachingInbyggd L1/L2/L3 cache Unit Of WorkSchemalägger förändringar i den ordning de gjorts.
För- och nackdelar +- Många möjligheter till utökningar Få bra ramverk Modell med fokus på applikationens lösningsområde Dåligt verktygsstöd idag Rik funktionalitet tillsammans med O/R mappare Finns ingen O/R - standard Frikopplar affärslogik från databasstrukturen
LINQ
LINQ-projektet C# 3.0C# 3.0 Visual Basic 9.0Visual Basic 9.0 Andra…Andra….NET Language Integrated Query LINQ to Objects LINQ to DataSets LINQ to SQL LINQ to Entities LINQ to XML Objekt XML Relationer
var contacts = from c in customers where c.State == "WA" select new { c.Name, c.Phone }; var contacts = customers.Where(c => c.State == "WA").Select(c => new { c.Name, c.Phone }); “Extension methods” “Lambda expressions” “Query expressions” “Object initializers” “Anonymous types” “Local variable type inference” Nyheter i C# 3.0
LINQ to SQL
Direkt mappning mot SQL RAD Mål: Microsoft SQL Server ”Deferred Execution” Designmål RTM: Visual Studio 2008
Anpassning av affärslogiken Partiella klasser och metoder Optimering Lagrade procedurer Kompilerade frågor
“LINQ to SQL” Funktioner Anpassning – Affärslogiken – Partiella-klasser för genererade objekt – Lägg till metoder, medlemmar som inte ska lagras osv… – Partiella metoder används för affärslogik – Uppdateringslogik – Implementera partiella-metoder i deriverad klass – Anropa lagrade procedurer eller egen logik Optimering – Val vid “laddning” – “Gå igenom” relaterad information – ObjectTrackingEnabled – DeferredLoadingEnabled – Kompilerad fråga – Spara resurser vid generering av SQL från LINQ uttryck
LINQ to Entity Framework
Mappning Att ställa frågor Stored procedures Updatera data Koncept vi skall beröra Arkitektur
Mappning
Källa:
Datastorage OO Classes Datastore Objects Schema Datastore Objects Schema Entity Data Model Schema Entity Data Model Schema Conceptual ModelStorage/Logical Model *.CSDL *.MSL *.SSDL Map
Att ställa frågor
ObjectQuery Database ObjectContext EntityConnection EntityCommand EntityDataReader EntityConnection EntityCommand EntityDataReader
Database Normalised Application Objects Normalised Application Objects LINQ to Entities Queries LINQ to Entities Queries ‘Optimised’ Dynamic SQL ‘Optimised’ Dynamic SQL Views Stored Procs & TVFs Stored Procs & TVFs EF Entity SQL Queries Entity SQL Queries
Lazy Load Källa:
Load spans
Identity map Källa:
Uppdatera data
ObjectContext UnitOfWork Delete Insert Update
Stored procedures
Function mapping <Function Name="TenMostExpensiveProducts" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false” ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" /> SSDL: <FunctionImport Name="TenMostExpensiveProducts" EntitySet="Products" ReturnType="Collection(NorthwindEFModel.Products)" /> CSDL: MDL: var query = context.TenMostExpensiveProducts(); Context:
Insert / Update / Delete SSDL: MDL:
Arkitektur
Entity Client – EDM, Entity SQL Entity Framework Runtime Data Providers (ADO.NET patterns) SQL Server Relational DBMS Web Service Domain Modeling Tools Modeling Mapping Browsing Binding Programming Layers … Code Gen Mapping Query and Update Pipelines Transactions Metadata Services Objects Linq Objects Linq XML XLinq XQuery XML XLinq XQuery Applications SqlClient OtherClient Non- relational
Läs mer…
LINQ to DataSet
”Disconnected cache” Otypade Typade var query = from row in myDataSet.Tables["Customers"].AsEnumerable() where row.Field ("City") == "London" select new { row.Field ("CustomerID"), row.Field ("ContactName") } ; var query = from customer in northwind.Customers where customer.City == "London" select customer;
“LINQ to DataSet” Typade och otypade “Otypade” DataSet – Anropa AsEnumerable() på DataTable – Referera till fält via namn – Använd Field (kolumn-namn) – Projicera ut fält för starkt typade resultat “Typade” DataSet var query = from row in myDataSet.Tables["Customers"].AsEnumerable() where row.Field ("City") == "London" select new { row.Field ("CustomerID"), row.Field ("ContactName") } ; var query = from customer in northwind.Customers where customer.City == "London" select customer;
LINQ to XML
”Astoria”
REST: GET, POST, PUT, DELETE XML, JSON, RDF.../northwind.svc/Customers[ALFKI]?$expand=Orders AJAX och Silverlight