将项目Linq查询结果投射到复杂对象上。

4

我正在尝试将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 = ????
                };

这个可以一步完成吗?
1个回答

3
当然,您可以在Linq查询内部使用Linq查询。试试这个:

当然,您可以在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()对其进行包装。

啊,非常好。如果InvoiceDetails没有setter怎么办? - Phil Sandler
ToList() 抛出一个错误,但我将它改为了 IEnumerable<>。感谢您的帮助。 - Phil Sandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接