对复杂对象的项目Linq查询结果
本文关键字:Linq 查询 结果 项目 复杂 对象 | 更新日期: 2023-09-27 18:16:34
我正试图将EF查询的结果投射到包含子集合的复杂对象上。目前,我分两步完成此操作——首先查询,然后循环并创建投影。我想知道是否有可能在一步中做到这一点,但无法找出创建子集合实例的语法。
当前代码:var ctx = uow.Context;
var invoices = from i in ctx.Invoices.Include(inv => inv.BatchInvoices.Select(imp => imp.ImportBatch))
join bi in ctx.BatchInvoices on i.Id equals bi.InvoiceId
join ib in ctx.ImportBatches on bi.ImportBatchId equals ib.Id
select i;
var invoiceDTOs = new List<InvoiceDTO>();
foreach (Invoice invoice in invoices)
{
var invoiceDTO = new InvoiceDTO
{
DocumentDate = invoice.DocumentDate,
DocumentNumber = invoice.DocumentNumber,
DueDate = invoice.DueDate,
InvoiceId = invoice.Id
};
foreach (BatchInvoice batchInvoice in invoice.BatchInvoices)
{
var batchInvoiceDTO = new InvoiceDetailDTO
{
Current = batchInvoice.Current,
Days1To30 = batchInvoice.Days1To30,
Days31To60 = batchInvoice.Days31To60,
Days61To90 = batchInvoice.Days61To90,
DaysOver90 = batchInvoice.DaysOver90,
RunDate = batchInvoice.ImportBatch.FileGeneratedDate
};
invoiceDTO.InvoiceDetails.Add(batchInvoiceDTO);
}
invoiceDTOs.Add(invoiceDTO);
}
这就是我被卡住的地方:
var invoices2 = from i in ctx.Invoices.Include(inv => inv.BatchInvoices.Select(imp => imp.ImportBatch))
join bi in ctx.BatchInvoices on i.Id equals bi.InvoiceId
join ib in ctx.ImportBatches on bi.ImportBatchId equals ib.Id
select new InvoiceDTO
{
DocumentDate = i.DocumentDate,
DocumentNumber = i.DocumentNumber,
DueDate = i.DueDate,
InvoiceId = i.Id,
InvoiceDetails = ????
};
有可能一步完成吗?
当然,您可以在Linq查询中使用Linq查询。试试这个:
var invoices2 =
from i in ctx.Invoices.Include(inv => inv.BatchInvoices.Select(imp => imp.ImportBatch))
join bi in ctx.BatchInvoices on i.Id equals bi.InvoiceId
join ib in ctx.ImportBatches on bi.ImportBatchId equals ib.Id
select new InvoiceDTO
{
DocumentDate = i.DocumentDate,
DocumentNumber = i.DocumentNumber,
DueDate = i.DueDate,
InvoiceId = i.Id,
InvoiceDetails =
from b in i.BatchInvoices
select new InvoiceDetailDTO
{
Current = b.Current,
Days1To30 = b.Days1To30,
Days31To60 = b.Days31To60,
Days61To90 = b.Days61To90,
DaysOver90 = b.DaysOver90,
RunDate = b.ImportBatch.FileGeneratedDate
}
};
如果你真的需要InvoiceDetails
是一个List<T>
,你可能只需要用.ToList()
包裹那部分。