[英]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.