2017-02-21 20 views
-2

У меня есть структура, которая выглядит следующим образом:Linq цикл по коллекции детской и доход суммы

class Items 
{ 
//item properties 
List<Transactions> _ItemTransactions {get;set;} 
} 

А класс операции содержит следующие элементы:

class Transactions 
{ 
public int QuantitySoldTotal {get;set;} 
public double TransactionPrice {get;set;} 
} 

Я пытаюсь суммировать все месть всех транзакций вещей всецело. Я пытался сделать что-то вроде этого:

var totalRevenue = Context.Items.AsParallel().Select(x => x._ItemTransactions.Sum(y => y.TransactionPrice * y.QuantitySoldTransaction)).FirstOrDefault(); 

Но я всегда получаю значение 0 в ответ ... Может кто-нибудь помочь мне с этим?

+2

Эта строка не должна компилироваться. Что такое 'Items.AsParallel()'? «Элементы» - это тип (по крайней мере, в коде, который вы показываете). Есть ли у него статический метод «AsParallel»? Если это переменная списка (которую вы просто не показывали), почему вы хотите суммировать все, а затем взять только первое? –

+0

@ RenéVogt Элементы - это простой список, заполненный элементами из базы данных ... – User987

+0

@ RenéVogt Я обновил свой вопрос с добавленным контекстом перед элементом ... – User987

ответ

1
var totalRevenue = Context.Items.AsParallel().Select(x => x.Transactions.Sum(y => y.TransactionPrice * y.QuantitySoldTransaction)).FirstOrDefault(); 

позволяет сломаться, что вы делаете здесь

Context.Items.AsParallel() Run параллельно (вероятно, не требуется) возвращение IEnumerable<Item>

.Select(x => x.Transactions.Sum(y => y.TransactionPrice * y.QuantitySoldTransaction)) для каждого пункта в сумме списка до операции, таким образом, оставив вас с IEnumerable<double>

.FirstOrDefault(); получить первый элемент из IEnumerable<double> результата, который в вашем случае, вероятно, случайно, всегда равна нулю

мое предположение, что вы хотели это

var totalRevenue = Context.Items 
        .Sum(x => x._ItemTransactions 
           .Sum(y => y.TransactionPrice * y.QuantitySoldTransaction) 
         ); 

в основном не возвращаются FirstOrDefault, но Подводя сумму

или Alternativly

var totalRevenue = Context.Items 
         .SelectMany(x => x._ItemTransactions) 
         .Sum(x => x.QuantitySoldTotal * x.TransactionPrice); 
+0

Tocsoft, первый метод дает мне совершенно неправильные результаты (я могу проверить свою предыдущую версию приложения). Попробуем альтернативный вариант, который вы разместили =) – User987

+0

оба фрагмента вернут то же самое значение для одного и того же ввода, выбор больше зависит от предпочтения. Ответ возвращает сумму всех транзакций по всем пунктам, если это не то, что вы хотите, не ясно. Если это то, что вы хотите, значит, код правильный, и может быть, ваша старая версия была неправильной. – tocsoft

2

Linq имеет Sum метод

double totalRevenue = items._ItemTransactions.Sum(transaction => transaction.TransactionPrice * transaction.QuantitySoldTotal); 

Подводя список списков вы можете сделать что-то вроде

double totalRevenue = Context.Items.Sum(items => items._ItemTransactions.Sum(transaction => transaction.TransactionPrice * transaction.QuantitySoldTotal)); 

Или

double totalRevenue = Context.Items.SelectMany(items => items._ItemTransactions).Sum(transaction => transaction.QuantitySoldTotal * transaction.TransactionPrice); 
+0

Я не уверен, как я могу получить доступ к _ItemTransactions, когда Context.Items - это сама коллекция? Должен ли я сначала каким-то образом получить доступ к дочернему узлу, а затем к транзакциям? – User987

+1

@ User987 Отредактированный мой ответ – Guy

1

Это должно дать вам ожидаемый результат: -

var totalRevenue = Context.Items.SelectMany(x => x._ItemTransactions) 
           .Sum(x => x.QuantitySoldTotal * x.TransactionPrice); 

Первое использование SelectMany, чтобы сплющить ваш внутренний списка т.е. _ItemTransactions, после этого вы можете просто позвонить LINQSum метод для выполнения суммы, как вы делаете в обычном списке.

+0

нет Элементы, как представлено, не должны работать –

+0

@BRAHIMKamel - Не понял? Если 'Context.Items' возвращает коллекцию _Items_, то почему бы не работать? –

+0

, если да, но это не так с кодом фрагмента –