簡體   English   中英

使用 LINQ 將 DataTable 轉換為嵌套對象

[英]Convert DataTable to a nested object using LINQ

我有一個使用存儲過程返回數據表的存儲過程。 我可以使用以下代碼將其轉換為對象: outgoingPaymentData.AsEnumerable().Select(x => new OutgoingPaymentApprovalDetails() { });

這是我的OutgoingPaymentApprovalDetails

 public class OutgoingPaymentApprovalDetails
 {
    public int OriginatorId { get; set; }

    public string Name { get; set; }

    public string DocumentId { get; set; }

    public string DebtorName { get; set; }

    public string Currency { get; set; }

    public double Amount { get; set; }

    public string Description { get; set; }

    public string DebitAccountNo { get; set; }

    public string CreditAccountNo { get; set; }
}

現在,我需要添加層次結構,而不是平面列表,以將這個對象選擇為 3 個對象。

類如下:

public class OriginatorDetails
{
     public int OriginatorId { get; set; }
     public string Name { get; set; }
     public List<DocumentDetails> DocumentDetails { get; set; }

}

public class DocumentDetails
{
   public string DocumentId { get; set; }
   public List<TransactionDetails> TransactionDetails { get; set; }
}
public class TransactionDetails
{
   public string Amount { get; set; }
   public string DebitAccountNo { get; set; }
   public string CreditAccountNo { get; set; }
}

基本上,特定Originator所有文檔都必須在DocumentDetails列表中,並且特定文檔的所有TransactionDetails必須在該列表中。

一種方法是創建一個字典並在其中添加內容,最后創建一個對象。 我想知道是否有更簡潔、更有效的方法來做這樣的事情。 TIA

您可以使用 Linq 對檢索到的OutgoingPaymentApprovalDetails記錄進行分組,以創建OriginatorDetails集合的嵌套對象。

看下面的代碼

var originalDetails = inputs.GroupBy(g => g.OriginatorId)
                      .Select(g => new OriginatorDetails() 
                      { 
                           OriginatorId = g.Key, 
                           Name = g.First().Name, 
                           DocumentDetails = g.GroupBy(d => d.DocumentId)
                                    .Select(d => new DocumentDetails() 
                                     {
                                            DocumentId = d.Key,
                                            TransactionDetails = d.Select(t => new TransactionDetails() 
                                            { 
                                                DebitAccountNo = t.DebitAccountNo,
                                                CreditAccountNo = t.CreditAccountNo, 
                                                Amount = t.Amount.ToString() 
                                            }).ToList()
                                     })
                                    .ToList() 
                     });

檢查創建的https://dotnetfiddle.net/FCA7Qc以演示您的場景。

試試這個代碼:基本上你需要分組 2 次,第一次按OriginatorIdName然后按DocumentId像這樣:

            var result = list.GroupBy(c => new {c.OriginatorId, c.Name})
                .Select(g => new OriginatorDetails()
                {
                    Name = g.Key.Name,
                    OriginatorId = g.Key.OriginatorId,
                    DocumentDetails = g
                        .GroupBy(dd => dd.DocumentId)
                        .Select(dd => new DocumentDetails()
                        {
                            DocumentId = dd.Key,
                            TransactionDetails = dd.ToList()
                                .Select(td => new TransactionDetails()
                                {
                                    Amount = td.Amount.ToString(),
                                    CreditAccountNo = td.CreditAccountNo,
                                    DebitAccountNo = td.DebitAccountNo
                                }).ToList()
                        }).ToList()
                }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM