在禁用代理的情况下加载多级嵌套导航和集合属性

时间:2018-06-07 16:23:08

标签: azure entity-framework-6 linq-to-entities azure-sql-database

我很难弄清楚如何使用代理和延迟加载来交替收集和导航属性的级别进行查询,以序列化结果。

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; }
}

我需要整个图表。启用延迟加载后,它最终会返回所有内容,但序列化需要几秒钟,并且需要对DB进行多次查询。我禁用了它并尝试了以下查询:

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 :(得分:0)

感谢David的评论,我能够构建一个有效的查询:

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);
}