Синтаксис запроса Linq эквивалентная группа по идентификатору, имеющему сумму (сумму)> x сумма

#linq

#linq

Вопрос:

В моем примере у меня есть таблица данных, подобная этой (в реальном на несколько столбцов больше, чем показано ниже):

 Id             Amount
1              2
12             4
12             6
22             7
22             7
  

Мне нужно сгруппировать по идентификатору, имеющему сумму (сумму)> 5, например:

 Id             Amount
12             10
22             14
  

Я сначала группирую, затем проецирую группы на потоки данных, затем создаю таблицу данных, используя расширение CopyToDataTable. И это работает отлично.

Я новичок в этом методе Linq и синтаксисе запроса, не могли бы вы посоветовать мне, где я могу добавить предложение С СУММОЙ (суммой)> 5 в дополнение к существующему запросу ниже?

Ниже приведен мой запрос:

 var newDt = dt.AsEnumerable()
              .GroupBy(r => r.Field<int>("Id"))
              .Select(g =>
              {
                  var row = dt.NewRow();

                  row["Id"] = g.Key;
                  row["Amount"] = g.Sum(r => r.Field<int>("Amount"));

                  return row;
              }).CopyToDataTable();
  

Ответ №1:

Вот два способа достижения этого:

 var newDt = dt.AsEnumerable()
    .GroupBy(r => r.Field<int>("Id"))
    .Select(r =>
    {
        var row = dt.NewRow();
        row["Id"] = r.Key;
        row["Amount"] = r.Sum(x => x.Field<int>("Amount"));
        return row;
    })
    .Where(r => r.Field<int>("Amount") > 5)
    .OrderBy(r => r.Field<int>("Id"))
    .CopyToDataTable();
  

или

 var newDt = dt.AsEnumerable()
    .GroupBy(r => r.Field<int>("Id"))
    .Where(r => r.Sum(x => x.Field<int>("Amount")) > 5)
    .Select(r =>
    {
        var row = dt.NewRow();
        row["Id"] = r.Key;
        row["Amount"] = r.Sum(x => x.Field<int>("Amount"));
        return row;
    })
    .OrderBy(r => r.Field<int>("Id"))
    .CopyToDataTable();
  

Комментарии:

1. Уважаемый Карло Бос, спасибо за решение моей проблемы. Не могли бы вы немного объяснить порядок вашего запроса. Я вижу, вы ввели другой метод оператора Select? Просто дополнительный вопрос, если я хочу заказать идентификатор, где должен быть размещен метод OrderBy?

2. Я обновил свой ответ, чтобы полностью использовать строки таблицы данных, исключив использование объекта enumerable и необходимость в двух Select операторах. Я также добавил OrderBy , чтобы показать, куда это приведет.

3. Большое спасибо за вашу помощь, Карло. Хорошего дня!

4. Привет, Карлос, извините, что снова беспокою вас по тому же вопросу. Мне любопытно узнать о вашем запросе, можно ли поместить метод Where между GroupBy и Select? Каково влияние этого? Надеюсь, вы не возражаете ответить на это

5. Да, безусловно, однако это будет выбор между созданием строк, которые будут отфильтрованы, или выполнением вычисления совокупной суммы дважды. Приведенный выше ответ проще для понимания.