Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Как получить связанные сущности на даппере?

#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 List GetLiveEnquiryServices(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 ICollection Products { 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(), }); }

Комментариев нет:

Отправить комментарий