Linq To Entities рдмрдирд╛рдо Linq рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдореВрд╣реАрдХрд░рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ

LINQ рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ, рд╕реБрдВрджрд░, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдкрдЯреА рдирд╣реАрдВ рд╣реИред LINQ рдФрд░ LINQ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЬрдВрдХреНрд╢рди рдкрд░ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдЖрдЬ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдореИрдВ LINQ To Entities (Entity Framework) рдФрд░ LINQ To Objects рдХрд╛ рд╕рд╣рдпреЛрдЧ рджреЗрдЦреВрдВрдЧрд╛ред



рдЪрд▓реЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд┐рдзрд┐ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреАрдХреГрдд рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЖрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдСрд░реНрдбрд░рдЖрдИрдбреА, рдСрд░реНрдбрд░рдбреЗрдЯ рдФрд░ рдХрд╕реНрдЯрдордЖрдИрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ):
public IDictionary<long, List<Order>> GetOrdersByCustomersIds(IList<long> customersIds) { using (var ctx = new RepositoryContext()) { return ctx.Orders. Where(o => customersIds.Contains(o.Id)). GroupBy(o => o.CustomerId). ToDictionary(o => o.Key, o => o.ToList()); } } 


рдПрдХ рдорд┐рдирдЯ рд░реБрдХреЛ! рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рджрд░рдЕрд╕рд▓, рдЧреНрд░реБрдк рдмрд╛рдп рдмрд╛рдп рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧреНрд░реБрдкрд┐рдВрдЧ рд╣реЛрддреА рд╣реИ, рд╕рд╛рде рд╣реА рдПрдЧреНрд░реАрдЧреЗрдЯреЗрдб рд╡реИрд▓реНрдпреВрдЬрд╝ рднреАред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рддрд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛ рдФрд░ рд╕рдореВрд╣реАрдХрд░рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдПрдХ JOIN рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
  SELECT o1.*, MinTotal FROM Orders as o1 INNER JOIN (SELECT o2.CustomerId, Min(o2.Total) as MinTotal FROM Orders o2 GROUP BY o2.CustomerId) as o3 ON o1.CustomerId = o3.CustomerId Where o1.CustomerId in (1, 2, 3, 4, 5) 

рдИрдПрдл рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдРрд╕рд╛ рдХреБрдЫ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪрд▓реЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рд╣рд╛рде рдореЗрдВ MySQL .NET рдХрдиреЗрдХреНрдЯрд░ (MySQL рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ ADO.NET рдкреНрд░рджрд╛рддрд╛) рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрддреНрдкрдиреНрди рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ (рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ 1 рд╕реЗ 5 рддрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкрд╛рд░рд┐рдд рдХрд░рдирд╛):
 SELECT `Project2`.`C1`, `Project2`.`CustomerId`, `Project2`.`C2`, `Project2`.`CustomerId1`, `Project2`.`Id`, `Project2`.`OrderDate` FROM (SELECT `Distinct1`.`CustomerId`, 1 AS `C1`, `Extent2`.`CustomerId` AS `CustomerId1`, `Extent2`.`Id`, `Extent2`.`OrderDate`, CASE WHEN (`Extent2`.`CustomerId` IS NULL) THEN (NULL) ELSE (1) END AS `C2` FROM (SELECT DISTINCT `Extent1`.`CustomerId` FROM `orders` AS `Extent1` WHERE ((1 = `Extent1`.`Id`) OR (2 = `Extent1`.`Id`)) OR (((3 = `Extent1`.`Id`) OR (4 = `Extent1`.`Id`)) OR (5 = `Extent1`.`Id`))) AS `Distinct1` LEFT OUTER JOIN `orders` AS `Extent2` ON (((1 = `Extent2`.`Id`) OR (2 = `Extent2`.`Id`)) OR (((3 = `Extent2`.`Id`) OR (4 = `Extent2`.`Id`)) OR (5 = `Extent2`.`Id`))) AND (`Distinct1`.`CustomerId` = `Extent2`.`CustomerId`)) AS `Project2` ORDER BY `CustomerId` ASC, `C2` ASC 

рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реЗ рдкрд░, рдКрдкрд░ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдЖрд╡рд╛рдЬ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рд░реЛрдХреЛ! рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕рдореВрд╣реАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ? рд╕рдореВрд╣реАрдХрд░рдг рдЙрдЪрд┐рдд рд╣реИ рдЕрдЧрд░ рдПрдХрддреНрд░реАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдХреНрд╡реЗрд░реА рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реИ)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдореВрд╣реАрдХрд░рдг рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдЪрд▓реЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдореВрд╣рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ LINQ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 public IDictionary<long, List<Order>> GetOrdersByCustomersIds(IList<long> customersIds) { using (var ctx = new RepositoryContext()) { return ctx.Orders. Where(o => customersIds.Contains(o.Id)). AsEnumerable(). GroupBy(o => o.CustomerId). ToDictionary(o => o.Key, o => o.ToList()); } } 

рдЪрд┐рддреНрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдИрдПрдл рдкреНрд░рджрд╛рддрд╛ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:
 SELECT `Extent1`.`CustomerId`, `Extent1`.`Id`, `Extent1`.`OrderDate` FROM `orders` AS `Extent1` WHERE ((1 = `Extent1`.`Id`) OR (2 = `Extent1`.`Id`)) OR (((3 = `Extent1`.`Id`) OR (4 = `Extent1`.`Id`)) OR (5 = `Extent1`.`Id`)) 

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдХреНрд╡реЗрд░реА рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред

рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ - рдореИрдВ рд╕рд┐рд░реНрдл рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЗрд╕ рдЬрд╛рд▓ рдореЗрдВ рдкрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж LINQ To X рд╕реЗ LINQ рддрдХ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕рддрд░реНрдХ рд░рд╣реЛ!

PS рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореИрдВрдиреЗ MySQL .NET рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдЧ рдХрд╛ рдПрдХ рдХреЗрдВрджреНрд░рд┐рдд рдЧреБрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрд╖реЛрдВ рддрдХ рдирд╣реАрдВ рд░рд╣реЗрдЧрд╛ред

Source: https://habr.com/ru/post/In119624/


All Articles