Presentation is loading. Please wait.

Presentation is loading. Please wait.

Linq Overview Vincent GERMAIN. Evolution - Rappel Langage  C# 2.0  C# 3.0 (Local type inference, Lambda expression, Method extension,Anonymous type)

Similar presentations


Presentation on theme: "Linq Overview Vincent GERMAIN. Evolution - Rappel Langage  C# 2.0  C# 3.0 (Local type inference, Lambda expression, Method extension,Anonymous type)"— Presentation transcript:

1 Linq Overview Vincent GERMAIN

2 Evolution - Rappel Langage  C# 2.0  C# 3.0 (Local type inference, Lambda expression, Method extension,Anonymous type)

3 Evolution - Rappel.NET Framework .NET 2.0 .NET 3.0 (WPF, WCF, WF) .NET 3.5 (AJAX, LINQ)

4 Linq Overview Introduction Using Linq To Objects Using Linq To XML Using Linq To ADO.NET

5 Introduction LINQ :.NET Language Integrated Query Queries/manipulations of results(from any datasource) Integrated in.NET Framework Existing datasources which use Linq :  Linq To ADO.NET  Linq To Object  Linq To XML

6 Architecture LINQ

7 Linq To Object Linq to Objects  LINQ to Objects allows.NET developers to write “queries” over collections of objects  2 ways to write a linq query: Query Expression Extend Method

8 Linq Syntax int[] nums = new int[] {0,4,2,6,3,8,3,1}; new var result = from n in nums where n < 5 select n; Or var result = nums.Where(n=>n<5);

9 Linq Operators

10 Linq To XML Concept : all with objects XElement xe=new XElement(‘Book1’, new XElement(‘Book2’, new XAttribute(‘type’,’paper’))); No XSD Intellisense Available in VS2008 XDocument.Element(‘Book1’). Where(e=>e.Attribute(‘type’)==‘paper’);

11 Linq To ADO.NET Linq To DataSet Linq To Entities Linq To SQL

12 How To use Linq To SQL  Linq To SQL requires 2 things: Business Classes with Linq Attributes A DataContext class uses to manage the business Objects(Factory)  Creation(2 methods): Create a Linq To SQL dbml file with VS2008. The VS 2008 Linq To SQL Item provides automatically the DataContext Class and let you define your business class through drad&drop with the class designer. The Linq Attributes for each object is affected by the designer Create yours own classes definitions with Linq Attributes(…) & Implement a specific DataContext which herites from LinqContext(.NET Framework Class)

13

14 How to Do with Linq(part 1) Select  Method 1:var query=from u in UserRepository where u.IsAdmin select u;  Method2:var query=UserRepository.Where(u=>u.IsAdmin); Insert  LinqContext.Users.InsertOnSubmit(user); Update  User admin=UserRepository.Where(u=>u.IsAdmin).First(); admin.Name=« Francezinhas»; LinqContext.SubmitChanges(); Delete  LinqContext.Users.DeleteOnSubmit(user);  LinqContext.Users.DeleteAllOnSubmit(UserRepository);

15 How To Do with Linq (Part 2) Paging  var query=list.Skip(200).Take(20); Sorting  var query=list.OrderBy(c=>c.Name); Call Stored Procedure  var query=db.getProductById(5);

16 How To Do With Linq (Part 3) Transactions  Optimistic Concurrency(default) Try{ … db.submitChanges(); }catch(ChangeConflitException){ db.Resolve/db.ResolveAll }  Pessimistic Concurrency Using(TransactionScope tr=new TransactionScope()){.. db.SubmitChanges(); tr.Complete(); }

17 How To Do With Linq (Part 4) Datasource binding  LinqDataSource

18 Linq Advantages & Architecture Vincent GERMAIN

19 Linq Overview Why Linq ? Linq Issues Take advantage of Linq: Queries Construction Linq Architectures Benchmarks

20 Why Linq (Part 1)? UI.Web BLL DAL User u=userController.GetUser(12); u.name= « Francezinhas » userController.Save(u); Public class userController{ Public static User GetUser(int id) UserFactory.Get(id); Public static void Save(User u) UserFactory.Save(u); } Public class userFactory{ Public static User GetUser(int id) SqlCommand cmdGet… Public static void Save(User u) SqlCommand cmdUpdate… } Public class userController{ Public static User GetUser(int id) UserFactory.Get(id); Public static void Save(User u) UserFactory.Save(u); } Public class userFactory{ Auto-generated + Custom Queries } Public class userController{ Public static User GetUser(int id) UserFactory.Get(id); Public static void Save(User u) UserFactory.Save(u); } Public class LinqContext{ Auto-generated } Many factories One factory ADO.NET StandardRaptier / Code SmithLinq To SQL User u=userController.GetUser(12); u.name= « Francezinhas » userController.Save(u); User u=userController.GetUser(12); u.name= « Francezinhas » userController.Save(u);

21 Why Linq (Part 2)? Integrate to.Net Framework 3.5 (no install required except VS2008) No Datasource queries language required. Datasource modification can be perform without application code review/change. No more mistakes in query / security (SQL Injection with parameters). More simple for basic operations (CRUD, paging, sorting, filters…). Queries checked at compilation. Object relationship accessible without coding. Differed Methods for Queries construction

22 Linq To SQL Issues Works only with SQL Server ! (Except Linq To Entities) Serialization VS2008 DB changes Integration Changes tracker Grid Sorting Factory/BE separation Limitation SQL (Like/in) Loss of Performance (abstraction, interop…)

23 BLL Linq To SQL Queries construction DAL Public class OrderFactory{ static IList GetOrders(){ sql=‘select * from Orders where IsVisible=1’ return GetToList(cmd) } static IList GetOrderSales(){ sql=‘select * from Orders where IsVisible=1 and Type=1’ return GetToList(cmd) } static IList GetOrderSalesByName(n){ sql=‘select * from Orders where IsVisible=1 and Type=1 and name like’%’+n’%’’ return GetToList(cmd); } Public class OrderFactory{ static Order[] GetOrders(){ return GetAsArray(‘IsVisible=1’); } static Order[] GetOrderSales(){ return GetAsArray(‘IsVisible=1 and Type=1’); } static Order] GetOrderSalesByName(n){ return GetAsArray(‘IsVisible=1 and Type=1 and name like’%’+n+’%’’); } Public class OrderController{ IQueryable<> GetOrders(){ return LinqContext.Orders. Where(e=>e.IsVisible); } IQueryable<> GetOrderSales(){ return GetOrders(). Where(e=>e.Type==1); } IQueryable<> GetOrderSalesByName(s){ return GetOrderSales(). Where(e=>e.Name.Contains(s); } ADO.NET StandardRaptier / Code SmithLinq To SQL

24 Linq to SQL – Deferred/Nondeferred Operators Restriction (where) Projection (select) Partitioning (take, skip) Concatenation (Concat) Ordering (OrderBy, Then, Reverse) Join (Join, GroupJoin) Grouping (GroupBy) Set (Distrinct, Union, Intersect, Except) Conversion (Cast, OfType, AsEnumerable) Element (DefaultIfEmpty) Generation (Range, Repeat, Empty) Conversion (ToArray, ToList, ToDictionary, ToLookup) Equality (SequenceEqual) Element (First, Last, Single, ElementAt) Quantifiers (Any, All, Contains) Aggregate (Count,Sum, Min, Max, Average, Aggregate)

25 Linq To SQL Architecture Pony solution Independent LinqContext Transitional LinqContext(Parameter) UoW(Unit of Work) pattern

26 Linq Architecture Pony Solution UI.Web DAL using(LinqContext c=new LinqContext()){ User u=LinqContext.Users.Single(c=>c.Id=id); u.name= « Francezinhas »; userController.SubmitChanges(); } Public partial class LinqContext:System.Data.Linq.DataContext{}

27 Linq Architecture Simple Quick Pony Solution It’s the same as writing SQL in Code-Behind No Separation between UI & Business Impossible to use in another part of code (rewrite each time the same code) Use 1 LinqContext / Method (+/-) More maintenance

28 Linq Architecture Independent LinqContext UI.Web BLL DAL User u=userController.GetUser(12); u.name= « Francezinhas » userController.Save(u); Public class userController{ Public static User GetUser(int id){ using(LinqContext c=new LinqContext()) return LinqContext.Users.Single(c=>c.Id=id); } Public class userController{ Public static void Save(User u){ using(LinqContext c=new LinqContext()){ User oldUser=GetUser(u.Id); LinqContext.Users.Attach(oldUser,u); LinqContext.SubmitChanges(); }}} Public partial class LinqContext:System.Data.Linq.DataContext{}

29 Linq Architecture Business Rules independent from UI (UI cannot use directly LinqContext) Use a LinqContext only when required Only in charge of filling or saving an object (we can change without difficulties the factory. Ex: Raptier factories Serialization (No Tracker) Correct destruction of the Context Bad Performance (Load each time a LinqContext with relationship) Must detach an object for loading and attach an object to a context for saving (additional queries is needed) Hard to build a good transaction system (only possible with TransactionScope) Independent LinqContext

30 Linq Architecture Transitional LinqContext UI.Web BLL DAL using(LinqContext c=new LinqContext()){ User u=userController.GetUser(c,12); u.name= « Francezinhas » userController.Save(c,u); } Public class userController{ Public static User GetUser(LinqContext lc,int id){ return lc.Users.Single(c=>c.Id=id); } Public class userController{ Public static void Save(LinqContext lc,User u){ lc.SubmitChanges(); } Public partial class LinqContext:System.Data.Linq.DataContext{}

31 Linq Architecture Business Rules independent from UI Use a LinqContext only when required in UI and pass it through Methods Correct destruction of the Context Easy for transaction Object manipulation more simple with Object tracker (update, relationship…) No Serialization available (Tracker On or must be deactivated) Boring to pass through each methods the Context  Transitional LinqContext

32 Linq Architecture Unit of Work Pattern UI.Web BLL DAL User u=userController.GetUser(12); u.name= « Francezinhas » LinqDataContext.Save(); Public class userController{ Public static User GetUser(int id){ return LinqDataContext.Current.Users.Single(c=>c.Id=id); } Public class LinqDataContext{ public static LinqContext Current; Public static void Save(){ Current.SubmitChanges(); } Public partial class LinqContext:System.Data.Linq.DataContext{} void Application_BeginRequest(…) { LinqDataContext.Current = new LinqContext(); }

33 Linq Architecture Only one LinqContext used by user and request Correct destruction of the Context (in Application_EndRequest) Easy for transaction Object manipulation more simple with Object tracker (update, relationship…) No Serialization available (Tracker On or must be deactivated) Common LinqContext cannot be used when using Thread (Web application) Unit of Work Pattern

34 Linq Architecture Conclusion PerformancesDifficulties Technical Flexibility Business Flexibility Pony solution Independent LinqContext Transitional LinqContext UoW Pattern

35 Benchmarks TestRowsMethodAverage(ms) GetAllSorted100Linq1.880 GetAllSorted100Nhibernate2.354 GetAllSorted100Ado1.573 GetAllSorted10000Linq13.062 GetAllSorted10000Nhibernate13.437 GetAllSorted10000Ado229.755 SaveDelete100Linq3.291 SaveDelete100Nhibernate2.317 SaveDelete100Ado1.760 SaveDelete10000Linq3.197 SaveDelete10000Nhibernate2.692 SaveDelete10000Ado2.093

36 Benchmarks

37 Conclusion


Download ppt "Linq Overview Vincent GERMAIN. Evolution - Rappel Langage  C# 2.0  C# 3.0 (Local type inference, Lambda expression, Method extension,Anonymous type)"

Similar presentations


Ads by Google