2010-08-19 7 views
2

Мне очень сложно выяснить, как выполнять запрос LINQ в DataTable и возвращать полную строку при выполнении теста предложения WHERE на сумму.LINQ DataTable Sum In Where Section

Мой код:

transactionsToRemove.AddRange(paymentTransactionResults 
    .AsEnumerable() 
    .Where(...) 
    .GroupBy(r => (decimal)r["AccountNumber"])); 

Есть несколько транзакций для каждого ACCOUNTNUMBER, и мне нужно суммировать их вместе и определить, являются ли они меньше, чем введенные пользователем суммы (для моей цели, это называется balanceGreaterThan) , Я не могу найти примеров, чтобы кто-то сделал такие вещи.

Заранее спасибо, ТАК.

Редактировать: Мои извинения - Колонка мне нужно подвести называется "Баланс"

Edit 2: Окончательный код

transactionsToRemove.AddRange(paymentTransactionResults 
    .AsEnumerable() 
    .GroupBy(r => r.Field<string>("AccountNumber")) 
    .Where(g => g.Sum(r => r.Field<decimal>("Balance")) < balanceGreaterThan) 
    .SelectMany(g => g)); 

мне пришлось изменить GroupBy использовать г .Field, а не r ["AccountNumber"]

ответ

4

Вы пытаетесь отфильтровать сами группы (до fin d которые имеют большую сумму), а не строки, которые входят в группы.
Таким образом, вам нужно поставить Where() вызов после GroupBy:

transactionsToRemove.AddRange(paymentTransactionResults 
    .AsEnumerable() 
    .GroupBy(r => (decimal)r["AccountNumber"]) 
    .Where(g => g.Sum(r => r.Field<decimal>("Balance") < balanceGreaterThan)); 

EDIT: Если вы хотите получить IEnumerable<DataRow> назад (в отличие от IEnumerable<IGrouping<DataRow>>), вам нужно добавить .SelectMany(g => g).

+1

Ничего себе, Слэкс пытается быть чрезвычайно разборчивым с каждым другим ответом, чтобы получить его собственную поддержку. Хитрый! – Timwi

+0

@Timwi: Я делаю это для большинства ответов, даже если я не конкурирую с ними. Это довольно важный вопрос на начальном уровне, поэтому важно правильно получить детали. Кроме того, я ничего не делал. – SLaks

+0

Да, мне нужен IEnumerable назад. Вы были более чем полезны. Полный код, указанный выше. –

3
transactionsToRemove.AddRange(paymentTransactionResults 
    .AsEnumerable() 
    .GroupBy(r => (decimal)r["AccountNumber"]) 
    .Where(g => g.Sum(r => (decimal)r["Balance"]) <= someInput) 
    .SelectMany(g => g)); 
+0

не скомпилируется. 'g' не является' IEnumerable '. – SLaks

+0

Попробуйте сейчас - я включил 'SelectMany' :) –

+0

Да, я попробовал это на некоторых неправильных входных данных (а не на DataTable). Думаю, теперь это сработает. –

1

Я думаю, что вы хотите что-то вроде:

transactionsToRemove.AddRange(paymentTransactionResults 
    .AsEnumerable() 
    .GroupBy(r => (decimal)r["AccountNumber"])); 
    .Where(grp => grp.Sum(r => r["amount"]) < balanceGreaterThan); 
+0

Вы забыли бросить. – SLaks