【问题标题】:Entity Framework Navigation Properties are not listed while creating a converter创建转换器时未列出实体框架导航属性
【发布时间】:2017-08-31 16:04:11
【问题描述】:

我有以下工作实体框架代码,用于从实体框架结果创建 DTO。它创建了 InvoiceDTO 对象,其中包含 List<ServiceChargeDTO> 属性。这是参考Mapping Linq Query results to a DTO class

public class InvoiceDTO
{
    public int InvoiceID { get; set; }
    public List<ServiceChargeDTO> ServiceChargeLineItems { get; set; }
    public decimal InvoiceTotal { get; set; }
} 

public InvoiceDTO GetInvoiceByID(int invoiceIDParam)
{
    InvoiceDTO invoice=null;
    using (var db = new PortalEntities())
    {
        var invoices = from a in db.Invoices
                       where a.InvoiceID == invoiceIDParam
                       select new InvoiceDTO
                       {
                           InvoiceID = a.InvoiceID,
                           InvoiceTotal = a.InvoiceAmount,
                           ServiceChargeLineItems =
                                (from b in db.InvoiceServiceXrefs 
                                where a.InvoiceID == b.InvoiceID 
                                select new ServiceChargeDTO
                                {
                                    ServiceChargeID = b.ServiceChargeID,
                                    Quantity = b.ServiceCharge.Qty,
                                    UnitPrice=b.ServiceCharge.UnitPrice,
                                    Amount=b.ServiceCharge.Amount
                                }
                                ).ToList()
                       };

        invoice = invoices.FirstOrDefault();
    }

    return invoice;
}

此处已成功检索到相关表中的数据。

InvoiceServiceXrefs.ServiceCharge.Qty

我需要改变这种方法并使其成为 convert 方法。

public InvoiceDTO GetInvoiceByID(int invoiceIDParam)
{
    var invoice2 = null;
    using (var db = new PortalEntities())
    {
        var invoices2 = from b in db.Invoices
                        where b.InvoiceID == invoiceIDParam
                        select b;
        invoice2 = ToInvoiceDTO(invoices2.FirstOrDefault());
     }

    return invoice2;
}

但是当我输入invoice.InvoiceServiceXrefs. 时,导航属性没有被列出。

如何正确获取导航属性并使用List&lt;ServiceChargeDTO&gt; 创建InvoiceDTO 对象?

【问题讨论】:

  • invoice.InvoiceServiceXrefs 是一个集合。与第一个代码 sn-p (from b in db.InvoiceServiceXrefs) 类似,您必须对其进行迭代才能使用它包含的实体。但是请注意,这种ToInvoiceDTO 方法效率较低:它会触发多个查询。
  • invoice 参数的类型是 Invoice,而不是 InvoiceDTO,并且您没有为名为 Invoice 的类显示任何代码
  • @Lijo 是否有任何答案有助于回答您的问题?你能更新一下吗?
  • 坦率地说,我不明白赏金。如果您在我上面的评论后仍有疑问,您可以简单地问。现在我不知道你还有什么不清楚的地方。
  • 您需要通过 InvoiceServiceXrefs 进行交互。在此之前,您还需要在 FirstOrDefault() 调用之前急切加载它,因为它不会为您带来 InvoiceServiceXrefs

标签: c# entity-framework linq


【解决方案1】:

您可以使用与您在初始查询中使用的几乎相同的代码来映​​射您的 ServiceChargeLineItems

private static InvoiceDTO ToInvoiceDTO(Invoice invoice)
{
    InvoiceDTO e = new InvoiceDTO()
    {
        InvoiceID = invoice.InvoiceID,
        InvoiceTotal = invoice.TotalAmount
    };

    e.ServiceChargeLineItems = invoice.InvoiceServiceXrefs.
                               Select(b => new ServiceChargeDTO
                               {
                                   ServiceChargeID = b.ServiceChargeID,
                                   Quantity = b.ServiceCharge.Qty,
                                   UnitPrice = b.ServiceCharge.UnitPrice,
                                   Amount = b.ServiceCharge.Amount
                               }).ToList()

    return e;
}

更新:

以下是它的名称。请注意在 invoicesQuery 上使用 ToList()。这种方法发出多个查询。

var invoicesQuery = from a in db.Invoices
             where a.InvoiceID == invoiceIDParam
            select a;

List<InvoiceDTO>  listTest = invoicesQuery.ToList().Select(x => ToInvoiceDTO(x)).ToList();

【讨论】:

    【解决方案2】:

    当您在 GetInvoiceByID 方法中对 db.Invoices 运行 LINQ 查询时,它变成了 IQuerable 变量 invoices2。如果您不想一次性执行嵌套 LINQ 查询,最好将它们作为 DbSet invoices2 返回并使用它来创建所需的 DTO,如下所示

    public DbSet"<"Invoices">" GetInvoiceByID(int invoiceIDParam)
    {
         var invoice2 = null;
         using (var db = new PortalEntities())
         {
              var invoices2 = from b in db.Invoices
                              where b.InvoiceID == invoiceIDParam
                              select b;
              //REMOVE THIS invoice2 = ToInvoiceDTO(invoices2.FirstOrDefault());
          }
    
          return invoice2;
    }
    

    【讨论】:

      【解决方案3】:

      您似乎需要将您的 List&lt;InvoiceServiceXrefs&gt; 映射到 List&lt;ServiceChargeDTO&gt;

      private static InvoiceDTO ToInvoiceDTO(Invoice invoice)
      {
          InvoiceDTO e = new InvoiceDTO()
          {
              InvoiceID = invoice.InvoiceID,
              InvoiceTotal = invoice.TotalAmount
          };
      
          foreach(var invRef in invoice.InvoiceServiceXrefs)
          {
              e.ServiceChargeLineItems.Add(new ServiceChargeDTO
              {
                  ServiceChargeID = invRef.ServiceChargeID,
                  Quantity = invRef.Qty,
                  UnitPrice = invRef.UnitPrice,
                  Amount = invRef.Amount
              });
          }
      
          return e;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多