#c_sharp #sql #aspnet_mvc #entity_framework #dapper
Есть запрос на Entity Framework, который вызывает таблицы из БД по Id другой таблицы var result = this.Context.LiveEnquiryServices .Include("LiveService") .Include("LiveEnquirySection") .Include("LiveEnquiryDocuments") .FirstOrDefault(x => x.LiveEnquirySectionId == liveEnquirySectionId && x.LiveServiceId == serviceId); return result; Пытаюсь сделать тоже самое, только через Dapper, пока что выходит что-то такое public ListGetLiveEnquiryServices(Enquiry enquiry) { List liveEnquiryService = new List (); var query = $"SELECT LiveService.*, LiveEnquirySection.*, LiveEnquiryDocuments.* FROM LiveEnquiryServices WHERE LiveEnquirySectionId = '{enquiry.Id}';"; using (IDbConnection db = new SqlConnection(_connectionString)) { liveEnquiryService = db.Query , LiveEnquiryService>(query, (les, ls, lesn, lesd) => { les.LiveService = ls; les.LiveServiceId = ls.Id; les.LiveEnquirySection = lesn; les.LiveEnquirySectionId = lesn.Id; les.LiveEnquiryDocuments = lesd; //les.LiveEnquiryDocuments = lesd; return les; }, splitOn: "Id").ToList(); } return liveEnquiryService.ToList(); } Кто-то может подсказать, как доделать то, что пытаюсь сделать я? Если вопрос не понятен или мало информации, пишите - буду дополнять.
Ответы
Ответ 1
Всё это есть на заглавной странице репозитория на github. Что хочется отметить сразу. Ваш вопрос распадается на два подвопроса: подгрузка связанных сущностей связанных отношением один-к-одному (в ваших примерах это .Include(x => x.LiveService) и .Include(x => x.LiveEnquirySection) подгрузка связанных сущностей связанных отношением один-ко-многим (в вашем вопросе это .Include(x => x.LiveEnquiryDocuments)) Вот и рассмотрим его на моём примере (для того, чтобы рассматривать ваш - нужно представлять поля сущностей), другие примеры посмотрите в документации. В базе у нас будет всего две сущности: Brand и Products. public class Brand { public int ID { get; set; } public string Name { get; set; } public virtual ICollectionProducts { get; set; } } public class Product { public int ID { get; set; } public string Name { get; set; } public int BrandID { get; set; } public virtual Brand Brand { get; set; } } Получение связанных сущностей один-к-одному: Исходный linq-запрос: this.Db.Product .Include(x => x.Brand) .AsNoTracking() .ToArray(); Код для dapper: var sql = @" select * from Products p left join Brands b on b.ID = p.BrandID where 1 = 1 "; var data = this.Connection.Query (sql, (p, b) => { p.Brand = b; return p; }); return data.ToArray(); Кажется громоздким и непривычным? Лишь поначалу. Получение связанных сущностей один-ко-многим: Исходный linq-запрос имеет вид: this.Db.Brand .Include(x => x.Products) .AsNoTracking() .ToArray(); К сожалению, dapper не очень хорошо умеет поддерживать подобную загрузку, поэтому воспользуемся возможностью подгрузки Multiple Results в одном запросе: var sql = @" select b.ID , b.Name from Brands b where 1 = 1 select p.ID , p.Name , p.BrandID from Products p where 1 = 1 "; using (var multi = this.Connection.QueryMultiple(sql)) { var brands = multi.Read (); var products = multi.Read (); return brands.Select(x => new Brand { ID = x.ID, Name = x.Name, Products = products.Where(y => y.BrandID == x.ID).ToArray(), }); }
Комментариев нет:
Отправить комментарий