йȵITվ
|
|

Ϊʲô˵LINQҪʤSQL

е˵ LINQ ͬ C#( VB)һ𣬹ʶ˱Ժݿ֮ϵĺ蹵ͬʱΪԴṩ˵һIJѯӿڡȻЩʵǹµһ֡ҪǣҪݿвѯʱLINQ ڴ¶ SQL Ч

ߣԴݿ⿪|2017-03-24 16:39

51CTO8.26 ˽廪ѧѹ㷨ITάʵ̽


㻹ûг LINQͻɶСֵġSQL ûлΪʲôҪ޲? ΪʲôǻҪһֲѯ?

е˵ LINQ ͬ C#( VB)һ𣬹ʶ˱Ժݿ֮ϵĺ蹵ͬʱΪԴṩ˵һIJѯӿڡȻЩʵǹµһ֡ҪǣҪݿвѯʱLINQ ڴ¶ SQL Ч

ͬ SQL ȣ LINQ 򵥡Ҹ߼Ӹ C# ͬ C++ Ƚϡģʱʹ C++ Ȼõѡ(ʹ SQL ij)ڴУʹִԶΪײϸڲһʤ

SQL һŷdzϵ— 1974 ꡣȻչûбƹʹе— VB6 Visual FoxProҲѾϰڴκδ©ĵط!

һӡҪдһ򵥵IJѯȡͻݣ£

  1. SELECT UPPER(Name
  2.  
  3. FROM Customer 
  4.  
  5. WHERE Name LIKE 'A%' 
  6.  
  7. ORDER BY Name 

ڼҪЩṩһҳȡ 21 30 ݡҪһӲѯ

  1. SELECT UPPER(NameFROM 
  2.  
  3.  
  4.    SELECT *, RN = row_number() 
  5.  
  6.    OVER (ORDER BY Name
  7.  
  8.    FROM Customer 
  9.  
  10.    WHERE Name LIKE 'A%' 
  11.  
  12. ) A 
  13.  
  14. WHERE RN BETWEEN 21 AND 30 
  15.  
  16. ORDER BY Name 

Ҫְ֧汾( SQL Server 2005 ֮ǰ)ϵݿ⣬:

  1. SELECT TOP 10 UPPER (c1.Name
  2.  
  3. FROM Customer c1 
  4.  
  5. WHERE 
  6.  
  7.    c1.Name LIKE 'A%' 
  8.  
  9.    AND c1.ID NOT IN 
  10.  
  11.    ( 
  12.  
  13.       SELECT TOP 20 c2.ID 
  14.  
  15.       FROM Customer c2 
  16.  
  17.       WHERE c2.Name LIKE 'A%' 
  18.  
  19.       ORDER BY c2.Name 
  20.  
  21.    )  
  22.  
  23. ORDER BY c1.Name 

ӶңҲΥ DRY ԭʹ LINQ ʵͬIJѯܡȻڼϸʤһ

  1. var query = 
  2.  
  3.    from c in db.Customers 
  4.  
  5.    where c.Name.StartsWith ("A"
  6.  
  7.    orderby c.Name 
  8.  
  9.    select c.Name.ToUpper(); 
  10.  
  11.   
  12.  
  13. var thirdPage = query.Skip(20).Take(10); 

ֻеöٵ thirdPage ʱѯŻʵִСڴ LINQ SQL Entity Framework ijУὫ(϶ɵ)ѯתһ SQL 䣬ӵݿŻġ

Ѿע⵽ LINQ һ΢(΢ش)ĺôѡеѯ裺

  1. IQueryable Paginate (this IQueryable query, int skip, int take) 
  2.  
  3.  
  4.    return query.Skip(skip).Take(take); 
  5.  

ǿ

  1. var query = ... 
  2.  
  3. var thirdPage = query.Paginate (20, 10); 

ҪǣǿԽķҳѯ֮ͨ LINQ ԰Ѳѯֽһ֣ȻӦóá

LINQ һôԲ JOIN ܽйϵѯ磬Ҫгй $1000 ϣҾסڻʢٵĹ˿͡ǻٶùĿ(ҲǾIJɹ/Ŀɹ)Ұ(ûй˿ͼ¼)ֽҲҪĸ(Purchase, Customer, Address Լ PurchaseItem)֮вѯʹ LINQIJѯѴ֮

  1. from p in db.Purchases 
  2.  
  3. where p.Customer.Address.State == "WA" || p.Customer == null 
  4.  
  5. where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000 
  6.  
  7. select p 

ͬȹܵ SQL Ƚϣ

  1. SELECT p.* 
  2.  
  3. FROM Purchase p 
  4.  
  5.     LEFT OUTER JOIN  
  6.  
  7.         Customer c INNER JOIN Address a ON c.AddressID = a.ID 
  8.  
  9.     ON p.CustomerID = c.ID 
  10.  
  11. WHERE 
  12.  
  13.    (a.State = 'WA' || p.CustomerID IS NULL
  14.  
  15.     AND p.ID in 
  16.  
  17.     ( 
  18.  
  19.         SELECT PurchaseID FROM PurchaseItem 
  20.  
  21.         GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 
  22.  
  23.     ) 

ԴһչҪ۸УյͶӰʾԱԼĿǿȻظرЩIJѯ

  1. from p in db.Purchases 
  2.  
  3. where p.Customer.Address.State == "WA" || p.Customer == null 
  4.  
  5. let purchaseValue = p.PurchaseItems.Sum (pi => pi.SaleAmount) 
  6.  
  7. where purchaseValue > 1000 
  8.  
  9. orderby purchaseValue descending 
  10.  
  11. select new 
  12.  
  13.  
  14.    p.Description, 
  15.  
  16.    p.Customer.SalesPerson.Name
  17.  
  18.    PurchaseItemCount = p.PurchaseItems.Count() 
  19.  

ʹ SQL ʵͬIJѯ

  1. SELECT  
  2.  
  3.     p.Description, 
  4.  
  5.     s.Name
  6.  
  7.     (SELECT COUNT(*) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) PurchaseItemCount 
  8.  
  9. FROM Purchase p 
  10.  
  11.     LEFT OUTER JOIN  
  12.  
  13.         Customer c  
  14.  
  15.             INNER JOIN Address a ON c.AddressID = a.ID 
  16.  
  17.             LEFT OUTER JOIN SalesPerson s ON c.SalesPersonID = s.ID 
  18.  
  19.     ON p.CustomerID = c.ID 
  20.  
  21. WHERE 
  22.  
  23.     (a.State = 'WA' OR p.CustomerID IS NULL
  24.  
  25.     AND p.ID in 
  26.  
  27.     ( 
  28.  
  29.         SELECT PurchaseID FROM PurchaseItem 
  30.  
  31.         GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 
  32.  
  33.     ) 
  34.  
  35. ORDER BY 
  36.  
  37.     (SELECT SUM (SaleAmount) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) DESC 

˼ǿԽ SQL ѯתص LINQɵIJѯÿһ鶼ɵʽظ̳ﳣIJѯ(ͨǷǹİ汾)—— SQL ˼ LINQ ˼Ľǽ Fortran ת C# 6 ʱᱧԹ GOTO ı׾﷨һ

ڲѯдӶѡ – յĽһƽΪλԪ顣ʹ˶ SQLΪ²ᷢ——ظӶʹý޷ڿͻ˺ܺõʹáԵʱԽܡ෴LINQ Իȡķֲ㼶ݡͱظý״ڴҲϲıҪ磬Ҫȡһ˿ͣÿһ¼ǵĸ߼ֵסʹ LINQ

  1. from c in db.Customers 
  2.  
  3. where c.Address.State == "WA" 
  4.  
  5. select new 
  6.  
  7.  
  8.    c.Name
  9.  
  10.    c.CustomerNumber, 
  11.  
  12.    HighValuePurchases = c.Purchases.Where (p => p.Price > 1000) 
  13.  

HighValuePurchasesһϡDzѯһԣͲҪˡһϻϵϸͱܺõijˡڴУ SQLܾһϣLINQ ΪӼϷصԪؾųСҪһԷһϵĶ:

  1. from c in db.Customers 
  2.  
  3. where c.Address.State == "WA" 
  4.  
  5. let HighValuePurchases = c.Purchases.Where (p => p.Price > 1000)where HighValuePurchases.Any()select new 
  6.  
  7.  
  8.    c.Name
  9.  
  10.    c.CustomerNumber, 
  11.  
  12.    HighValuePurchases 
  13.  

LINQ ͨһḻIJƽϡϡѯԼֲͬͲѯ֧֡

Ҫ֮ǰӲأ”WA”״̬DzǾҪһ? ʵֻҪͿ:

  1. string state = "WA"
  2.  
  3.   
  4.  
  5. var query = 
  6.  
  7.    from c in db.Customers 
  8.  
  9.    where c.Address.State == state 
  10.  
  11.    ... 

DbCommand IJߵ SQL ע빥 LINQ IJͰȫҸ߶ȿɶġ——ҽúܲ

Ϊ LINQ ѯʱԽϣǿνʡ磬дһ£

  1. IQueryable GetCustomers (string state, decimal? minPurchase) 
  2.  
  3.  
  4.     var query = Customers.AsQueryable(); 
  5.  
  6.      
  7.  
  8.     if (state != null
  9.  
  10.         query = query.Where (c => c.Address.State == state); 
  11.  
  12.      
  13.  
  14.     if (minPurchase != null
  15.  
  16.         query = query.Where (c => c.Purchases.Any (p => p.Price > minPurchase.Value)); 
  17.  
  18.      
  19.  
  20.     return query; 
  21.  

ʹÿյ state Լ minPurchase ֵôöٽʱ SQL ͻᱻɳ

  1. SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] 
  2.  
  3. FROM [Customer] AS [t0] 

ָ state minPurchase ֵLINQ SQL ͲֻѯνʣбҪ䣺

  1. SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] 
  2.  
  3. FROM [Customer] AS [t0] 
  4.  
  5. LEFT OUTER JOIN [Address] AS [t1] ON [t1].[ID] = [t0].[AddressID] 
  6.  
  7. WHERE (EXISTS( 
  8.  
  9.     SELECT NULL AS [EMPTY] 
  10.  
  11.     FROM [Purchase] AS [t2] 
  12.  
  13.     WHERE ([t2].[Price] > @p0) AND ([t2].[CustomerID] = [t0].[ID]) 
  14.  
  15.     )) AND ([t1].[State] = @p1) 

Ϊǵķһ IQueryableѯöٵ֮ǰᱻʵʵת SQL ִС͸˵ýһνʡҳԶͶӰȵȵĻᡣ

̬Ͱȫ

֮ǰIJѯУǽ state һһַôѯڱʱͻᱨõȵʱҲͬڰѱŪعʱһʵڵĺôûͷĹʾ

ͻ˴

LINQ ɵؽѯһЩתƵͻϽдڸظϴݿʵܡֻҪȡûг(֮㻹Ҫڷ)ͿԾԵͨѶԽתԼѹתƵؽٵӦ÷ȥʹ LINQҪľ AsEnumerable() תƵѯ֮УǸ֮鶼ڱִС

ʲôʱ LINQ ȥѯݿ

LINQ Ĺǿ󣬵ȡ SQL 95% ϵ󣬲ʱȻҪSQL:

  • ҪֶIJѯ (ҪŻͽʾʱ);
  • Щ漰Ҫ select ʱȻҪЩвѯIJѯ;
  • Ԥ֪ĸԼ

оõʱ㻹Ҫ SQL (ʹ LINQ ʱĶdzҪҪʹô洢̺ͺʱSQL Dzɻȱ)ͨ SQL бдֵ SQL LINQ һ, ȻڸӸӵ LINQ ѯЩ

˽ŲѯԲ⣬Ϊ㶼Ҫȥѧϰ LINQ — LINQ ڲѯؼԼ XML DOM ʱdzʵáʹõȻϾɵĻ XmlDocument DOMLINQ to XML DOM һ־ϷЧĽ

о SQL LINQ գдIJѯʹ LINQ SQL ôɡ

LINQ ʵս

Ҽֻ LINQ ݿѯΪЧʡ

Ӧóıдԣҵĸ˾һʹ LINQ ݷʲ(ʹһ LINQ SQL Entity Framework API)ԽݷʵĿʱ俳һ룬ҿάӵɡ

༭Ƽ

  1. MySQLݰȫ
  2. ΪSQL Server 2008ݿû
  3. MySQLݿⳣ󼰽
  4. ſԴSQLŻSQLAdvisorڲ汾һ
  5. MySQLPostgreSQLĸã
α༭ľ TEL01068476606

0
:
Ҷڿ
ϲ

ְλ+

+

Java for Flash̬վ

dz˵JavaFlashXMLFlashýӦóĿ ֪ʶḻݽṹFlashӰƬӦó...

51CTOʿ

51CTOʿ
ٷѵ