¡¡¡¡Èç¹ûÄ㻹ûÓгÁÄçÓÚ LINQ£¬»áÏëÕâÓÐɶ´ó¾ªÐ¡¹ÖµÄ¡£SQL ²¢Ã»Óлµµô£¬ÎªÊ²Ã´»¹Òª¶ÔËü½øÐÐÐÞ²¹ÄØ? ΪʲôÎÒÃÇ»¹ÐèÒªÁíÍâÒ»ÖÖ²éѯÓïÑÔÄØ?
¡¡¡¡Á÷ÐеÄ˵·¨ÊÇ LINQ ͬ C#£¨»òÕß VB£©¼¯³ÉÔÚÁËÒ»Æ𣬹ʶøÏû³ýÁ˱à³ÌÓïÑÔºÍÊý¾Ý¿âÖ®¼äÅäºÏÉϵĺ蹵£¬Í¬Ê±Îª¶à¸öÊý¾ÝÔ´µÄ×éºÏÌṩÁ˵¥Ò»µÄ²éѯ½Ó¿Ú¡£ËäÈ»ÕâЩ¶¼ÊÇÊÂʵ£¬µ«½öÊǹÊʵÄÒ»²¿·Ö¡£¸üÖØÒªµÄÊÇ£ºµ±Òª¶ÔÊý¾Ý¿â½øÐвéѯµÄʱºò£¬LINQ ÔÚ´ó¶àÊýÇé¿ö϶¼±È SQL ¸ü¼ÓÓÐЧ¡£
¡¡¡¡Í¬ SQL Ïà±È£¬ LINQ ¸ü¼òµ¥¡¢Õû½à¶øÇҸ߼¶¡£ÕâÑù×Ó¸üÏñÊÇÄà C# ͬ C++ ×ö±È½Ï¡£ÕæµÄ£¬¾¡¹ÜÓÐʱºòʹÓà C++ ÈÔÈ»ÊǺõÄÑ¡Ôñ£¨±ÈÈçʹÓà SQL µÄ³¡¾°£©£¬µ«ÔÚ´ó¶àÊý³¡¾°ÖУ¬Ê¹ÓÃÏÖ´úÕû½àµÄÓïÑÔ¶ø²»±ØΪµ×²ãϸ½Ú²Ù×÷ÊÇÒ»Ïî´óʤÀû¡£
¡¡¡¡SQL ÊÇÒ»Ãŷdz£¹ÅÀϵÄÓïÑÔ—·¢Ã÷ÓÚ 1974 Äê¡£ËäÈ»¾­Àú¹ýÁËÎÞÊý´ËÀ©Õ¹£¬µ«´ÓÀ´Ã»Óб»ÖØÐÂÉè¼Æ¹ý¡£ÕâʹµÃËüÓеã»ìÂÒÁË—²»ÏñÊÇ VB6 »òÕß Visual FoxPro¡£ÄãÒ²ÐíÒѾ­ÂýÂý±äµÃÏ°¹ßÓÚ´ËÒò¶ø¿´²»µ½Èκδí©µÄµØ·½!
¡¡¡¡ÈÃÎÒÃÇÀ´¿´Ò»¸öÀý×Ó¡£ÄãÏëÒª±àдһ¸ö¼òµ¥µÄ²éѯÀ´»ñÈ¡¿Í»§Êý¾Ý£¬ÈçÏ£º
¡¡¡¡SELECT UPPER(Name)
¡¡¡¡FROM Customer
¡¡¡¡WHERE Name LIKE 'A%'
¡¡¡¡ORDER BY Name
¡¡¡¡ÏÖÔÚ¼ÙÉèÒª½«½á¹û¼¯ÀïµÄÕâЩÊý¾ÝÌṩ¸øÒ»¸öÍøÒ³£¬²¢ÇÒÎÒÃÇÏë»ñÈ¡µÚ 21 µ½ 30 ÐÐÊý¾Ý¡£ËùÒÔÎÒÃÇÐèÒªÒ»¸ö×Ó²éѯ£º
¡¡¡¡SELECT UPPER(Name) FROM
¡¡¡¡(
¡¡¡¡SELECT *£¬ RN = row_number()
¡¡¡¡OVER (ORDER BY Name)
¡¡¡¡FROM Customer
¡¡¡¡WHERE Name LIKE 'A%'
¡¡¡¡) A
¡¡¡¡WHERE RN BETWEEN 21 AND 30
¡¡¡¡ORDER BY Name
¡¡¡¡¶øÈç¹ûÄãÐèÒªÖ§³Ö°æ±¾£¨ÔÚ SQL Server 2005 ֮ǰµÄ£©¸üÀϵÄÊý¾Ý¿â£¬Çé¿ö»á¸üÔã¸â:
¡¡¡¡SELECT TOP 10 UPPER (c1.Name)
¡¡¡¡FROM Customer c1
¡¡¡¡WHERE
¡¡¡¡c1.Name LIKE 'A%'
¡¡¡¡AND c1.ID NOT IN
¡¡¡¡(
¡¡¡¡SELECT TOP 20 c2.ID
¡¡¡¡FROM Customer c2
¡¡¡¡WHERE c2.Name LIKE 'A%'
¡¡¡¡ORDER BY c2.Name
¡¡¡¡)
¡¡¡¡ORDER BY c1.Name
¡¡¡¡ÕâÑù×ö²»½ö¸´ÔÓ¶ø»ìÂÒ£¬¶øÇÒҲΥ±³ÁË DRY Ô­Ôò¡£ÈçÏÂÊÇʹÓà LINQ ʵÏÖÏàͬµÄ²éѯ¹¦ÄÜ¡£ÏÔÈ»ÔÚ¼òµ¥ÐÔÉϸüʤһ³ï£º
¡¡¡¡var query =
¡¡¡¡from c in db.Customers
¡¡¡¡where c.Name.StartsWith ("A")
¡¡¡¡orderby c.Name
¡¡¡¡select c.Name.ToUpper();
¡¡¡¡var thirdPage = query.Skip(20).Take(10);
¡¡¡¡Ö»Óе±ÎÒÃÇö¾Ùµ½ thirdPage ʱ£¬²éѯ²Å»áʵ¼ÊÖ´ÐС£ÔÚ´Ó LINQ µ½ SQL »òÕß Entity Framework µÄ³¡¾°ÖУ¬·­ÒëÒýÇæ»á½«£¨ÎÒÃÇÓÃÁ½¸ö²½Öè×éºÏ¶ø³ÉµÄ£©²éѯת»»³ÉÒ»¸ö SQL Óï¾ä£¬Õâ¸öÓï¾äÊÇÕë¶ÔÆäËùÁ¬½ÓµÄÊý¾Ý¿â·þÎñÆ÷½øÐÐÁËÓÅ»¯µÄ¡£
¡¡¡¡¿É×éºÏÐÔ
¡¡¡¡Äú¿ÉÄÜÒѾ­×¢Òâµ½ LINQ µÄÁíÒ»¸ö¸ü΢Ã΢ÃÒâÒåÖش󣩵ĺô¦¡£ÎÒÃÇÑ¡ÔñÁË×éºÏÖеÄÁ½¸ö²éѯ²½Ö裺
¡¡¡¡IQueryable Paginate (this IQueryable query£¬ int skip£¬ int take)
¡¡¡¡{
¡¡¡¡return query.Skip(skip).Take(take);
¡¡¡¡}
¡¡¡¡ÎÒÃÇ¿ÉÒÔÕâÑù×ö£º
¡¡¡¡var query = ...
¡¡¡¡var thirdPage = query.Paginate (20£¬ 10);
¡¡¡¡¸üÖØÒªµÄÊÇ£¬ÔÚÕâÀïÎÒÃÇ¿ÉÒÔ½øÐÐÈÎÒâµÄ·ÖÒ³²éѯ¡£»»ÑÔÖ®ÊÇͨ¹ý LINQ Äã¿ÉÒ԰Ѳéѯ·Ö½â³ÉÒ»²¿·Ö£¬È»ºóÔÚÄãµÄÓ¦ÓóÌÐòÖÐÖØÓá£
¡¡¡¡ÁªºÏ
¡¡¡¡LINQ ÁíÒ»ºÃ´¦ÊÇÄã¿ÉÒÔ²»Óà JOIN ÄܽøÐйØϵ¼ä²éѯ¡£ÀýÈ磬ÎÒÃÇÏëÒªÁгöËùÓйºÎïÔÚ $1000 »òÕßÒÔÉÏ£¬²¢ÇÒ¾ÓסÔÚ»ªÊ¢¶ÙµÄ¹Ë¿Í¡£ÎÒÃÇ»á¼Ù¶¨ÈùºÂòÏîÄ¿»¯£¨Ò²ÊǾ­µäµÄ²É¹º/ÏîÄ¿²É¹º³¡¾°£©²¢ÇÒ°Ñ£¨Ã»Óй˿ͼǼµÄ£©ÏÖ½ðÏúÊÛÒ²ÄÒÀ¨½øÀ´¡£ÕâÐèÒªÔÚËĸö±í£¨Purchase£¬ Customer£¬ Address ÒÔ¼° PurchaseItem£©Ö®¼ä½øÐвéѯ¡£Ê¹Óà LINQ£¬ÕâÑùµÄ²éѯ²»·Ñ´µ»ÒÖ®Á¦£º
¡¡¡¡from p in db.Purchases
¡¡¡¡where p.Customer.Address.State == "WA" || p.Customer == null
¡¡¡¡where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000
¡¡¡¡select p
¡¡¡¡½«´ËÓëͬµÈ¹¦ÄÜµÄ SQL Ïà±È½Ï£º
¡¡¡¡SELECT p.*
¡¡¡¡FROM Purchase p
¡¡¡¡LEFT OUTER JOIN
¡¡¡¡Customer c INNER JOIN Address a ON c.AddressID = a.ID
¡¡¡¡ON p.CustomerID = c.ID
¡¡¡¡WHERE
¡¡¡¡(a.State = 'WA' || p.CustomerID IS NULL)
¡¡¡¡AND p.ID in
¡¡¡¡(
¡¡¡¡SELECT PurchaseID FROM PurchaseItem
¡¡¡¡GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000
¡¡¡¡)
¡¡¡¡¶Ô´ËÀý½øÒ»²½À©Õ¹£¬¼ÙÉèÎÒÃÇÏëÒª½«½á¹û¼¯°´¼Û¸ñ½øÐÐÄæÐòÅÅÁУ¬²¢ÔÚÖÕµÄͶӰÖÐÏÔʾÏúÊÛÔ±µÄÐÕÃûÒÔ¼°Ëù¹ºÂòÏîÄ¿µÄÊýÁ¿¡£ÎÒÃÇ¿ÉÒÔ×ÔÈ»²»Öظ´µØ±í´ï³öÕâЩ¸½¼þµÄ²éѯÌõ¼þ£º
¡¡¡¡from p in db.Purchases
¡¡¡¡where p.Customer.Address.State == "WA" || p.Customer == null
¡¡¡¡let purchaseValue = p.PurchaseItems.Sum (pi => pi.SaleAmount)
¡¡¡¡where purchaseValue > 1000
¡¡¡¡orderby purchaseValue descending
¡¡¡¡select new
¡¡¡¡{
¡¡¡¡p.Description£¬
¡¡¡¡p.Customer.SalesPerson.Name£¬
¡¡¡¡PurchaseItemCount = p.PurchaseItems.Count()
¡¡¡¡}
¡¡¡¡ÏÂÃæÊÇʹÓà SQL ʵÏÖÏàͬµÄ²éѯ£º
¡¡¡¡SELECT
¡¡¡¡p.Description£¬
¡¡¡¡s.Name£¬
¡¡¡¡(SELECT COUNT(*) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) PurchaseItemCount
¡¡¡¡FROM Purchase p
¡¡¡¡LEFT OUTER JOIN
¡¡¡¡Customer c
¡¡¡¡INNER JOIN Address a ON c.AddressID = a.ID
¡¡¡¡LEFT OUTER JOIN SalesPerson s ON c.SalesPersonID = s.ID
¡¡¡¡ON p.CustomerID = c.ID
¡¡¡¡WHERE
¡¡¡¡(a.State = 'WA' OR p.CustomerID IS NULL)
¡¡¡¡AND p.ID in
¡¡¡¡(
¡¡¡¡SELECT PurchaseID FROM PurchaseItem
¡¡¡¡GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000
¡¡¡¡)
¡¡¡¡ORDER BY
¡¡¡¡(SELECT SUM (SaleAmount) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) DESC
¡¡¡¡ÓÐÒâ˼µÄÊÇ¿ÉÒÔ½«ÉÏÊö SQL ²éѯת»»»Øµ½ LINQ£¬ËùÉú³ÉµÄ²éѯÿһ¿é¶¼»áÓÐɵ¹ÏʽÖظ´¡£ÂÛ̳Àï³£»áÌù³öÕâÑùµÄ²éѯ£¨Í¨³£ÊǷǹ¤×÷µÄ°æ±¾£©——ÕâÊÇÓà SQL ½øÐÐ˼¿¼¶ø²»ÊÇÒÔ LINQ ½øÐÐ˼¿¼µÄ½á¹û¡£ÕâÏñÊÇÊǽ« Fortran ³ÌÐòת»»³É C# 6 ʱ»á±§Ô¹ GOTO µÄ±¿×¾Óï·¨Ò»Ñù¡£
¡¡¡¡Êý¾ÝÐÞÕû
¡¡¡¡ÔÚ²éѯÁªºÏÖдӶà¸ö±íÑ¡ÔñÊý¾Ý – ÖյĽá¹û»áÊÇÒ»¸ö±âƽµÄÒÔÐÐΪµ¥Î»µÄÔª×é¡£Èç¹ûÄãʹÓÃÁ˶àÄêµÄ SQL£¬Äã¿ÉÄÜÈÏΪÕâÖÖʲ»»á·¢ÉúÔÚÄãÉíÉÏ——Ëüµ¼ÖÂÊý¾ÝÖظ´£¬´Ó¶øʹµÃ½á¹û¼¯ÎÞ·¨ÔÚ¿Í»§¶ËºÜºÃµØʹÓá£ËùÒÔµ±Ëü·¢ÉúʱÍùÍùÄÑÒÔ½ÓÊÜ¡£Óë´ËÏà·´£¬LINQ ÈÃÄã¿ÉÒÔ»ñÈ¡µ½ÐÝÕû¹ýµÄ·Ö²ã¼¶µÄÊý¾Ý¡£Õâ±ÜÃâÁËÖظ´£¬Èýá¹û¼¯ÈÝÒ×´¦Àí£¬¶øÇÒÔÚ´ó¶àÊýÇé¿öÏÂÒ²»áÏû³ý½øÐÐÁªºÏ²Ù×÷µÄ±ØÒª¡£ÀýÈ磬¼ÙÉèÎÒÃÇÏëÒªÌáÈ¡Ò»×é¹Ë¿Í£¬Ã¿Ò»Ìõ¼Ç¼¶¼´øÉÏÁËËüÃǵĸ߼ÛÖµ½»Òס£Ê¹Óà LINQ£¬Äã¿ÉÒÔÕâÑù×ö£º
¡¡¡¡from c in db.Customers
¡¡¡¡where c.Address.State == "WA"
¡¡¡¡select new
¡¡¡¡{
¡¡¡¡c.Name£¬
¡¡¡¡c.CustomerNumber£¬
¡¡¡¡HighValuePurchases = c.Purchases.Where (p => p.Price > 1000)
¡¡¡¡}
¡¡¡¡HighValuePurchases£¬ÔÚÕâÀïÊÇÒ»¸ö¼¯ºÏ¡£ÓÉÓÚÎÒÃDzéѯµÄÊÇÒ»¸öÏà¹ØÊôÐÔ£¬²»ÐèÒª½øÐÐÁªºÏÁË¡£Òò´ËÕâÊÇÒ»¸öÄÚÁªºÏ»¹ÊÇÍâÁªºÏµÄϸ½ÚÎÊÌâ±»ºÜºÃµÄ³éÏóµôÁË¡£ÔÚ´ËÀýÖУ¬µ±·­Òë³ÉÁË SQL£¬¿ÉÄÜÊÇÒ»¸öÍâÁªºÏ£ºLINQ ²»»áÒòΪ×Ó¼¯ºÏ·µ»ØµÄÊÇÁã¸öÔªËØÅųýÐС£Èç¹ûÎÒÃÇÏëÒªÓÐÒ»¸ö¿ÉÒÔ·­Òë³ÉÒ»¸öÄÚÁªºÏµÄ¶«Î÷£¬¿ÉÒÔÕâÑù×ö:
¡¡¡¡from c in db.Customers
¡¡¡¡where c.Address.State == "WA"
¡¡¡¡let HighValuePurchases = c.Purchases.Where (p => p.Price > 1000)where HighValuePurchases.Any()select new
¡¡¡¡{
¡¡¡¡c.Name£¬
¡¡¡¡c.CustomerNumber£¬
¡¡¡¡HighValuePurchases
¡¡¡¡}