2016-07-10 2 views
2

В моем коде ниже я хотел бы получить Invoices со своими суммами InvoiceLine, а также список Tracks, связанный с каждым Invoice.SelectMany из сгруппированного элемента

var screenset = 
    from invs in context.Invoices 
    join lines in context.InvoiceLines on invs.InvoiceId equals lines.InvoiceId 
    join tracks in context.Tracks on lines.TrackId equals tracks.TrackId 
    group new { invs, lines, tracks } 
    by new 
    { 
     invs.InvoiceId, 
     invs.InvoiceDate, 
     invs.CustomerId, 
     invs.Customer.LastName, 
     invs.Customer.FirstName 
    } into grp 
    select new 
    { 
     InvoiceId = grp.Key.InvoiceId, 
     InvoiceDate = grp.Key.InvoiceDate, 
     CustomerId = grp.Key.CustomerId, 
     CustomerLastName = grp.Key.LastName, 
     CustomerFirstName = grp.Key.FirstName, 
     CustomerFullName = grp.Key.LastName + ", " + grp.Key.FirstName, 
     TotalQty = grp.Sum(l => l.lines.Quantity), 
     TotalPrice = grp.Sum(l => l.lines.UnitPrice), 
     Tracks = grp.SelectMany(t => t.tracks) 
    }; 

Однако, в последней строке были я сделал SelectMany дает мне ошибку:

Tracks = grp.SelectMany(t => t.tracks) 

Ошибка:

The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.

Любые идеи, почему?

Заранее спасибо.

+0

Может быть [этот вопрос] (http://stackoverflow.com/questions/3917249/the-type-arguments-for-method-cannot-be-inferred -из-использования) также отвечает на ваши вопросы. – meJustAndrew

ответ

1

Объект tracks - это единственный трек, а не список. Если вам нужно использовать SelectMany, использовать нужно выбрать список для того, чтобы:

Projects each element of a sequence to an IEnumerable and flattens the resulting sequences into one sequence.

Так Измените его на:

Tracks = grp.Select(t => t.tracks) 

Реальное использование SelectMany, когда у вас есть список списков и вы хотите преобразовать списки в один список. Пример:

List<List<int>> listOfLists = new List<List<int>>() 
{ 
    new List<int>() { 0, 1, 2, 3, 4 }, 
    new List<int>() { 5, 6, 7, 8, 9 }, 
    new List<int>() { 10, 11, 12, 13, 14 } 
}; 

List<int> selectManyResult = listOfLists.SelectMany(l => l).ToList(); 

foreach (var r in selectManyResult) 
    Console.WriteLine(r); 

Выход:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
+0

Это прибило его! Я сам пришел к выводу, когда нажимаю «Треки», и он говорит «IEnumerable '. Благодаря! – superfly71

Смежные вопросы