[英]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 次,第一次按OriginatorId
和Name
然后按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.