繁体   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