2013-06-25 77 views
0

喜的特性的子集的一个组合列表说我有对象:的LINQ如何查询项目的列表基于父项目

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组:

invoice1invoice2invoice3invoice4

和B组:

invoice5invoice6invoice7invoice8

最远的我得到是:

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

据我所知,将得到所有八个invoiceLines。不知何故,我需要按群组进行区分,以获得组A的组群,并为组B做同样的事情。

任何人都可以帮忙吗?

回答

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 
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(); 
0

看看这个过载的Enumerable.SelectMany

var result = invoiceHeaders 
       .SelectMany(x => x.InvoiceLines, 
          (group, InvoiceLine)=>{group, InvoiceLine}) 
       .Where(res => res.group='A'); 
+0

试过这个不会编译 – user2005657

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

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 
       }; 

的项目,你有一个标准的前提下,应该工作加入两个实体。

相关问题