Estoy usando ac# y linq2db y tengo la siguiente jerarquía de clases/tablas:
public class YearlyTemplate { [Column] public int Id { get; set; } public List<MonthlyTemplate> MonthlyTemplates { get; set;} } public class MonthlyTemplate { [Column] public int Id { get; set; } [Column] public int YearlyTemplateId { get; set; } public YearlyTemplate YearlyTemplate{ get; set; } public List<DailyTemplate> DailyTemplates { get; set;} } public class DailyTemplate { [Column] public int Id { get; set; } [Column] public int MonthlyTemplateId { get; set; } public MonthlyTemplate MonthlyTemplate { get; set; } } public class AppDataConnect : DataConnection { public ITable<YearlyTemplate> YearlyTemplates => GetTable<YearlyTemplate>(); public ITable<WeeklyTemplate> WeeklyTemplates => GetTable<WeeklyTemplate>(); public ITable<DailyTemplate> DailyTemplates => GetTable<DailyTemplate>(); }Quiero obtener un año específico de la base de datos usando la instrucción where, pero quiero obtener todas las Plantillas mensuales anidadas para él y todas las Plantillas diarias para cada Plantilla mensual. ¿Cómo puedo hacerlo usando linq2db de manera efectiva? Supongo que debería usar group by, pero solo funciona en un nivel de profundidad.
Nada especial aquí. Al igual que en EF Core, linq2db contiene métodos para Eager Loading. Al principio tienes que definir Asociaciones
public class YearlyTemplate { [Column] public int Id { get; set; } [Association(ThisKey = nameof(YearlyTemplate.Id), OtherKey = nameof(MonthlyTemplate.YearlyTemplateId))] public List<MonthlyTemplate> MonthlyTemplates { get; set;} } public class MonthlyTemplate { [Column] public int Id { get; set; } [Column] public int YearlyTemplateId { get; set; } public YearlyTemplate YearlyTemplate{ get; set; } [Association(ThisKey = nameof(MonthlyTemplate.Id), OtherKey = nameof(DailyTemplate.MonthlyTemplateId))] public List<DailyTemplate> DailyTemplates { get; set;} }y consulta
var query = from y in db.YearlyTemplates .LoadWith(yt => yt.MonthlyTemplates) .ThenLoad(mt => mt.DailyTemplates) where y.Id == 1 select y; var result = query.ToArray();O con filtros (dos formas de personalizar LoadWith/ThenLoad)
var query = from y in db.YearlyTemplates .LoadWith(yt => yt.MonthlyTemplates.Where(mt => !mt.IsDeleted)) .ThenLoad(mt => mt.DailyTemplates, q => q.Where(ti => !dt.IsDeleted)) where y.Id == 1 select y; var result = query.ToArray();O puede usar una proyección personalizada, que puede ser más eficaz porque puede elegir solo los campos necesarios:
var query = from y in db.YearlyTemplates where y.Id == 1 select new { Id = y.Id, MonthlyTemplates = y.MonthlyTemplates.Select(mt => new { mt.Id, DailyTemplates = mt.DailyTemplates.ToArray() }).ToArray() }; var result = query.ToArray();