0

嗨说我有对象:

public class InvoiceLine
{
}

public class InvoiceHeader
{
    public char Group { get; set; }
    public List<InvoiceLine> InvoiceLines { get; set; }
}

为他们设置的数据如下:

var invoiceLine1 = new InvoiceLine();
var invoiceLine2 = new InvoiceLine();
var invoiceLine3 = new InvoiceLine();
var invoiceLine4 = new InvoiceLine();
var invoiceLine5 = new InvoiceLine();
var invoiceLine6 = new InvoiceLine();
var invoiceLine7 = new InvoiceLine();
var invoiceLine8 = new InvoiceLine();

var invoiceHeader1 = new InvoiceHeader { Group = 'A', InvoiceLines = new List<InvoiceLine> { invoiceLine1, invoiceLine2 } };
var invoiceHeader2 = new InvoiceHeader { Group = 'A', InvoiceLines = new List<InvoiceLine> { invoiceLine3, invoiceLine4 } };
var invoiceHeader3 = new InvoiceHeader { Group = 'B', InvoiceLines = new List<InvoiceLine> { invoiceLine5, invoiceLine6 } };
var invoiceHeader4 = new InvoiceHeader { Group = 'B', InvoiceLines = new List<InvoiceLine> { invoiceLine7, invoiceLine8 } };

var invoiceHeaders = new List<InvoiceHeader>
{
    invoiceHeader1,
    invoiceHeader2,
    invoiceHeader3,
    invoiceHeader4
};

我想要得到的是每个组的 invoiceLines 列表。

所以我想A组:

invoice1, invoice2,invoice3invoice4

对于 B 组:

invoice5, invoice6,invoice7invoice8

我得到的最远的是:

var invoiceLinesGroupA = invoiceHeaders.SelectMany(x => x.InvoiceLines);

据我所知,这将获得所有八个 invoiceLines。不知何故,我需要按组进行区分,以便为 groupA 获取那些,并为 groupB 做同样的事情。

有人能帮忙吗?

4

5 回答 5

1

您可能只想按组对发票标题进行分组:

var groups = invoiceHeader.GroupBy(ih => ih.Group);

然后您可以访问组的行:

foreach(var group in groups)
{
    Console.WriteLine("Group " + group.Group);
    Console.WriteLine("Lines:");
    Console.WriteLine(string.Join(", ", group.SelectMany(h => h.InvoiceHeader.InvoiceLines)));
}

输出将类似于

Group A
Lines:
invoice1, invoice2, invoice3, invoice4

Group B
Lines:
invoice5, invoice6, invoice7, invoice8
于 2013-06-25T08:41:55.883 回答
0
var regrouped = invoiceHeaders
    .SelectMany(
        header => header.InvoiceLines,
        (header, line) => new { header, line }
    )
    .GroupBy(
        o => o.header.Group,
        o => o.line,
        (groupName, lines) => new InvoiceHeader
        {
            Group = groupName,
            InvoiceLines = lines.ToList()
        }
    )
    .ToList();
于 2013-06-25T08:42:44.693 回答
0

看看这个Enumerable.SelectMany的重载

var result = invoiceHeaders
               .SelectMany(x => x.InvoiceLines,
                           (group, InvoiceLine)=>{group, InvoiceLine})
               .Where(res => res.group='A');
于 2013-06-25T08:43:07.673 回答
0

这应该这样做:

        var test = from h in invoiceHeaders
                   from i in h.InvoiceLines
                   group i by h.Group
                   into g
                   select new {key = g.Key, rows = g.ToArray()};

然后您可以访问这样的项目test.Where(x => x.key == 'A').rows

于 2013-06-25T08:43:47.907 回答
0
var q = from current in myInvoiceHeaders
                join c in myInvoiceLines on current.Id equals c.Header.Id into linesByHeader                    
                select new {
                    Header = current,
                    Lines = linesByHeader
                };

应该在您有条件加入两个实体的前提下工作。

于 2013-06-25T08:43:59.773 回答