2015-06-10 2 views
0

Мне нужно возвращать только один результат, мне нужно суммировать все состояния (1, 3) и (2, 4, 5) затем вычесть каждый общий пример:Sum и вычитание с помощью Linq C#

cashtransaction_amount, cashtransactionstatus_id 
50.00     1 (+) 
39.99     2 (-) 
330.70     3 (+) 
10.00     5 (-) 
50.50     4 (-) 
30.00     2 (-) 

Sum(1,3): 50.00 + 330.70 = 380.70 
Sum(2, 5, 4): 39.99 + 10.00 + 50.50 + 30.00 = 130.49 
Final Result Sum(1,3) - Sum(2, 5, 4): 380.70 - 130.49 = 250.21 

I судимый:

(from DataRow Transaction_DataRow in Dt_transaction.AsEnumerable() 
where Transaction_DataRow.Field<Int32>("cashpaymenttype_id") == 1 // Cash Money 
group Transaction_DataRow by Transaction_DataRow.Field<Int32>("cashtransactionstatus_id") into tmp 
select new 
    { 
     cashtransaction_amount = tmp.Sum(x => (x.Field<Int32>("cashtransactionstatus_id") == 1 || x.Field<Int32>("cashtransactionstatus_id") == 3) ? x.Field<Double>("cashtransaction_amount") : -x.Field<Double>("cashtransaction_amount")) 
    }).Aggregate(Transaction_DataTable, (dt, result) => { dt.Rows.Add(result.cashtransaction_amount); return dt; }); 

ответ

1

Другой способ:

total = tmp.Select(b => 
      { 
       var id = b.Field<Int32>("cashtransactionstatus_id"); 
       return (id == 1 || id == 3 ? 1 : -1) * 
         b.Field<Double>("cashtransaction_amount"); 
      }).Sum(); 

Или:

total = tmp.Sum(b => (new[]{1,3}.Contains(b.Field<Int32>("cashtransactionstatus_id")) 
          ? 1 : -1) * b.Field<Double>("cashtransaction_amount")); 
+0

Спасибо за помощь, что вы можете сказать мне, где определяется 'b' var? потому что я получаю следующую ошибку: 'Имя 'b' не существует в текущем контексте' –

+0

x должен был быть b. Исправлено. – SimpleVar

+0

. Друг попробовал по-разному ваш пример и всегда дает мне плохой результат, может, пожалуйста, дать мне полный пример, примененный к моему коду? Спасибо –

2

вы пробовали

cashtransaction_amount = tmp.Aggregate((a,b) => 
    { 
     var id = b.Field<Int32>("cashtransactionstatus_id"); 
     var amt = b.Field<Double>("cashtransaction_amount"); 
     return id == 1 || id == 3 ? a + amt : a - amt; 
    }); 
+0

не проблема, спасибо – maksymiuk

+0

Hy Спасибо за вашу помощь, но я получаю эту ошибку: 'Ошибка 3 Оператор«+»не может быть применен к операндам типа«System.Data .DataRow 'и' double'' –

+0

попробуйте ввести id и amt как этот 'int32 id = b.Field (" cashtransactionstatus_id ") как int32;' 'double amt = b.Field (" cashtransaction_amount ") как double;' – maksymiuk

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