С# linq возвращает каждую n-ю строку списка

Я использую .NET 6, у меня есть класс "projectStatistics" Который содержит статистику проекта в данный день.

public class ProjectStatistics {
   public int ProjectStatisticsId {get; set;}
   public Project Project {get; set}
   public DateTime Date {get; set}
   public int statistic1 {get; set}
   public int statistic3 {get; set}
   ...
   ...
}

Поскольку запрос этого результата требует больших ресурсов, он выполняется каждые 24 часа в фоновом режиме. Затем результат сохраняется в базе данных, которую затем можно использовать для создания диаграммы.

Теперь я борюсь с тем, что когда в базе данных есть, например, 1000 строк, я не хочу делать диаграмму со всеми этими записями, скажем, я хотел бы сделать диаграмму с 50 датами (записи в базе данных )

Затем я хотел бы вернуть все строки в таблице, где строка % 20 == 0, проблема в том, что я не могу использовать rowId, чтобы проверить, является ли строка % x == 0, поскольку таблица содержит статистику для нескольких проектов.

Я нашел этот вопрос при переполнении стека: Разделить один список на несколько списков по кратному числу

У меня есть этот оператор LINQ:

var result = projectStatistics
   .Where(s => s.Project == project) // Note: project is a repo method parameter
   .Select( (value, index) => new
   {
     value, 
     index
   })
   .GroupBy(item => item.index % 20, item => item.value) // Note: 20 is a repo method parameter.
   .Select(chunk => chunk.FirstOrDefault()).AsEnumerable();

Только этот запрос дает мне следующую ошибку:

The LINQ expression 'DbSet<ProjectStatistics>()
    .Where(s => s.Project == __project_0)
    .Select((value, index) => new { 
        value = value, 
        index = index
     })' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

Вы намерены получить каждую 20-ю строку? Если да, возможно, вы могли бы использовать для этой цели .Chunk()? Что-то вроде var result = projectStatistics.Where(s => s.Project == project).Chunk(20).SelectMany(ch => ch.First()).AsEnumerable();.

Astrid E. 23.04.2022 12:30

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

Niels 23.04.2022 12:32

к сожалению, это также возвращает ту же ошибку (невозможно перевести)

Niels 23.04.2022 12:36

Какую базу данных вы используете. Вы используете EF Core?

Guru Stron 23.04.2022 14:18
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проблема LINQ в Entities может не понять, как преобразовать эту Select перегрузку (которую вы используете)

Мы можем видеть это из MSDN Поддерживаемые и неподдерживаемые методы LINQ (LINQ to Entities)

SelectNot supported : IQueryable Select<TSource, TResult>( this IQueryable source, Expression<Func<TSource, int, TResult>> selector )

мы можем использовать AsEnumerable(), прежде чем вы используете перегрузку Select

Исходя из вашей логики, я делаю некоторые модификации, чтобы сделать код простым.

var result = projectStatistics
   .Where(s => s.Project == project)
   .AsEnumerable()
   .Select( (value, index) => new
   {
     value, 
     grp = index % 20
   })
   .Where(s => s.grp == 0);

Это просто извлекает весь проект и фильтрует в памяти…

Jonas Høgh 23.04.2022 14:01

@JonasHøgh Я тоже это заметил, хотя это не помогает, поскольку EF передает данные в потоковом режиме (поскольку вместо ToList или чего-то подобного использовался IEnumerable)

Niels 24.04.2022 12:04

@Niels Да, вы можете уменьшить использование памяти из-за потоковой передачи. Но вы все равно должны знать, что нагрузка на базу данных не слишком высока, и что запрос выполняется в течение приемлемого времени.

Jonas Høgh 24.04.2022 19:43

Другие вопросы по теме