Загрузка нескольких уровней вложенных свойств навигации и коллекции с отключенным прокси - PullRequest
0 голосов
/ 07 июня 2018

Мне трудно понять, как выполнять запросы с уровнями чередующихся свойств сбора и навигации с отключенной прокси и отложенной загрузкой для сериализации результата.

public ApplicationDbContext()
            : base("Debug")
        {
            this.Configuration.LazyLoadingEnabled = false;
            this.Configuration.ProxyCreationEnabled = false;
        }

Сущности выглядят так (опуская не навигацию или не коллекции):

public class Comprobante: ComprobanteGeneric 
{
}

public class ComprobanteGenericStructure
    public int Id { get; set; }
    [Required]
    public virtual Conceptos Conceptos { get; set; }
}

public class Conceptos
{
    public Conceptos()
    {
        Concepto = new List<Concepto>();
    }
    [ForeignKey("Comprobante")]
    public int Id { get; set; }
    [Required]
    public virtual ICollection<Concepto> Concepto { get; set; }
    public virtual Comprobante Comprobante { get; set; }
}

public class Concepto :RelatedComprobante
{
    [Key]
    public int Id { get; set; }
    public virtual OrderOfImpuestosForConceptos Impuestos { get; set; }
    public virtual Conceptos Conceptos { get; set; }
}

public class RelatedComprobante
{
    [ForeignKey("Comprobante")]
    public int ComprobanteId { get; set; }
    public virtual Comprobante Comprobante { get; set; }
}

public class OrderOfImpuestosForConceptos : RelatedComprobante
{
    public int Id { get; set; }
    public virtual TrasladosNode Traslados { get; set; }
    public virtual Retenciones Retenciones { get; set; }
}

public class TrasladosNode : RelatedComprobante
{
    public TrasladosNode()
    {
        Traslado = new HashSet<Traslado>();
    }
    [Key]
    public int Id { get; set; }
    [Required]
    public virtual ICollection<Traslado> Traslado { get; set; }
}

public class Traslado : RelatedComprobante
{
    public int Id { get; set; }
    public virtual TrasladosNode TrasladosNode { get; set; }
}

public class Retenciones : RelatedComprobante
{
    public Retenciones()
    {
        Retencion = new List<Retencion>();
    }
    public int Id { get; set; }
    [Required]
    public virtual ICollection<Retencion> Retencion { get; set; }
}

public class Retencion : RelatedComprobante
{
    public int Id { get; set; }
    public virtual Retenciones Retenciones { get; set; }
}

Мне нужен весь график.При включенной отложенной загрузке все возвращается, но сериализация занимает несколько секунд и несколько запросов к БД.Я отключил его и попробовал следующий запрос:

comprobantes = _db.Comprobante
            .Include(c => c.Conceptos.Concepto.Select(co => co.Impuestos.Retenciones).Select(r=>r.Retencion))
            .Include(c => c.Conceptos.Concepto.Select(co => co.Impuestos.Traslados).Select(t => t.Traslado));

Однако я получаю пустой список концептов:

[{
  "id": 324,
  "conceptos": {
    "concepto": []
  }
},
{
  "id": 340,
  "conceptos": {
    "concepto": []
  }
}
}]

Даже более простые запросы, подобные приведенным ниже, дают точно такие же результаты:

comprobantes = _db.Comprobante
            .Include(c => c.Conceptos.Concepto.Select(co => co.Impuestos));

Я знаю, это не сериализация, когда я проверяю объект, когда отладка пуста: Empty concepto array

Что я делаю не так?

1 Ответ

0 голосов
/ 07 июня 2018

Благодаря комментарию Дэвида я смог создать рабочий запрос (ы):

var comprobantes = _db.Comprobante
            .Include(b => b.Conceptos.Concepto.Select(c => c.Impuestos.Retenciones.Retencion))
            .Include(b => b.Conceptos.Concepto.Select(c => c.Impuestos.Traslados.Traslado));
foreach (var comprobante in comprobantes)
{
    _db.ComprobanteTraslado.Where(t => t.ComprobanteId == comprobante.Id);
    _db.ComprobanteRetencion.Where(r => r.ComprobanteId == comprobante.Id);
}
...