рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛ-рдУрдЖрд░рдПрдо

рдирдорд╕реНрддреЗ, рдкреНрд░рд┐рдп рд╣рднреНрд░рд╡рдЪрди!

рдореИрдВ ADO.NET рдкрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рдмрд╛рдЗрдХ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЪреВрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП "рдЬрдЯрд┐рд▓" рдкрд░рд┐рдгрд╛рдо рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдРрдб-рдЗрди рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рд╕реНрдЯрд░ рдЯреЗрдмрд▓ рдФрд░ рдХрдИ рдЕрдзреАрдирд╕реНрдереЛрдВ рд╕реЗ рдЪрдпрди рдХрд░рдирд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рднрд░рдирд╛ред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ


рдбреЗрдЯрд╛рд░рдХрд╛рд░реНрдб рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IL рдХреЛрдб рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдХреЗ рдореИрдкрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА DataManager рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд▓реЗрдХрд┐рди рд╕рдВрдЪрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг:

рдЖрдЗрдП рдПрдХ рд╡рд░реНрдЧ рд╡рд╛рд░рд┐рд╕ рдмрдирд╛рдПрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
class MSSqlDataManager : DataManager { public MSSqlDataManager() : base(new SqlConnection("ConnectionString here")) { } } 


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
 public class Product { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public int? Price { get; set; } } ... using (var dm = new MSSqlDataManager()) { List<Product> res = dm.Procedure("Test").GetList<Product>(); } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрд╕реНрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдбреЗрдЯрд╛ рдЪреБрдирддрд╛ рд╣реИ:
 SELECT p.Id, p.Name, p.[Description], p.Price FROM dbo.Product p 

рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛
hranimki,
 SELECT p.Id , p.Name, , p.[Description] , p.Price , StorageId = s.Id , StorageName = s.Name FROM dbo.Product p INNER JOIN dbo.Storages s ON s.Id = p.StorageId WHERE p.Id = @Id; SELECT c.Id , c.Body , c.WriteDate , UserId = u.Id , UserName = u.Name , UserLocationId = l.Id , UserLocationName = l.Name , c.ProductId FROM dbo.Comments c INNER JOIN dbo.Users u ON u.Id = c.UserId INNER JOIN dbo.Locations l ON l.Id = u.LocationId WHERE c.ProductId = @Id; 


рдПрдХ рдорд╛рд╕реНрдЯрд░ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рдХрдИ рдЕрдзреАрдирд╕реНрдереЛрдВ рдХрд╛ рдЪрдпрди:
 Product res = dm.Procedure("Test").AddParams(new { id = 10 }).Get<Product, ProductComment>(p => p.Comments); 

рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╣рд╛рдВ рд╣реИ
рдРрд╕рд╛ рд╣реИ
 public class UserLocation { public int Id { get; set; } public string Name { get; set; } } public class UserModel { public int Id { get; set; } public string Name { get; set; } public UserLocation Location { get; set; } public UserModel() { this.Location = new UserLocation(); } } public class ProductComment { public int Id { get; set; } public string Body { get; set; } public DateTime WriteDate { get; set; } public UserModel User { get; set; } public int ProductId { get; set; } public ProductComment() { this.User = new UserModel(); } } public class ProductStorage { public int Id { get; set; } public string Name { get; set; } } public class Product { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public int? Price { get; set; } public ProductStorage Storage { get; set; } public List<ProductComment> Comments { get; set; } public Product() { this.Storage = new ProductStorage(); this.Comments = new List<ProductComment>(); } } 


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрдЧ рдХреЗ рдореБрдЦреНрдп рдЧреБрдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреБрдг рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрдкрддреНрддрд┐ рд╡рд░реНрдЧ рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрдпрди рдореЗрдВ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рд╕рд╣реА рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UserLocationName рдХреЗ рд▓рд┐рдП рдпрд╣ рдореИрдкрд░ рдХреЛ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ProductComment рдкреНрд░рдХрд╛рд░), рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдВрдкрддреНрддрд┐, рдЙрд╕рдореЗрдВ рд╕реНрдерд╛рди рдФрд░ рдирд╛рдо рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд╛рд╣рд┐рдПред

рдЬреНрдпрд╛рджрд╛ рд╣реИред рдЕрдзреАрдирд╕реНрдереЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдорд╛рд╕реНрдЯрд░ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
 List<Product> res = dm.Procedure("Test") .GetList<Product, ProductComment>( (parents, detail)=>parents.First(p => p.Id == detail.ProductId).Comments ); 

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореИрдВрдиреЗ рдПрдХ рд╕реЗ рдХрдИ рдФрд░ рдХрдИ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдУрд╡рд░рд▓реЛрдбреЗрдб рддрд░реАрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА, рдЬрд┐рд╕рд╕реЗ рдЕрдзреАрдирд╕реНрде рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЪрд╛рд░ рд╕реЗрдЯ рддрдХ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рдЕрдзрд┐рдХ рдЕрдзреАрдирд╕реНрде рд╕реЗрдЯ рд╣реИрдВ (рдЬреЛ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИ), рддреЛ рдЖрдк рдЕрдзрд┐рдХ рдЕрдзрд┐рднрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 List<Product> res = dm.Procedure("Test") .GetList<Product>( (dr, parents) => { parents.Where(p=>p.Id == (int)dr["ProductId"]).First().Comments .Add(dm.Create<ProductComment>(dr)); }, (dr, parents) => { }, ... ); 

рдареАрдХ рд╣реИ, рдпрджрд┐ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдЙрдкрд░реЛрдХреНрдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд░реЙ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рд▓реИрдореНрдмрдбрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ IDataReader рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
 dm.Procedure("Test") .Raw(dr => { while (dr.Read()) { ... } }); 

рдмреЗрд╢рдХ, рд╕реНрдХреЗрд▓рд░ рдорд╛рди рдФрд░ рдЕрдЪреНрдЫреЗ-рдкреБрд░рд╛рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред
AddParams рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ
 dm.AddParams(new { id = 10, name = "stringparam", writeDate = DateTime.Now }) ... 

рдЯреЗрдмрд▓-рд╡реИрд▓реНрдпреВ рдкреИрд░рд╛рдореАрдЯрд░ (рдЯреЗрдмрд▓-рд╡реИрд▓реНрдпреВрдб рдкреИрд░рд╛рдореАрдЯрд░реНрд╕) рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рднреА рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИ - рдмреЗрд╢рдХ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП 2008 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
 dm.AddEnumerableParam("Details", Enumerable.Range(1, 10) .Select(e => new {id = e, name = string.Concat("Name", e.ToString())}) ); 


рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ, рд╣рдо рдбрд╛рдкрд░ рд╕реЗ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╣рдо рдПрдХ рдЧрд╛рдпрдХ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХрд╣рддреЗ рд╣реИрдВред
рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде IQueryable рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдЬреЛ ApiController рдХреЗ AspNet MVC рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдЗрдХ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles