Как построить запрос EF Core из LINQ, а затем передать запрос в фоновое задание для выполнения - PullRequest
1 голос
/ 10 февраля 2020

Как построить запрос из LINQ, а затем отправить в фоновое задание для выполнения? Я использую EF Core с Hangfire в качестве менеджера фоновой работы. Я попытался передать IQueryable, но Hangfire не может его сериализовать.

У меня есть несколько таблиц, которые можно экспортировать в формате csv. Пользователь может применять фильтры и сортировку перед экспортом.

В настоящее время метод Export создает запрос, выполняет его, а затем преобразует список в csv для загрузки пользователем. Это фрагмент кода:

        public async Task Export(GetAllVitaminDataInput input)
        {
            var query = CreateFilteredQuery(input);
            query = ApplySorting(query, input);

            var entities = await AsyncQueryableExecuter.ToListAsync(query);

            //map to dto
            var dtos = ObjectMapper.Map<List<ExportVitaminDataDto>>(entities);

            //create csv file and store on file server
            var zipFileName = _exportManager.ExportToFile(dtos.Cast<object>().ToList(), "FilePrefix");

        }

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

        public async Task ExportBackground(GetAllVitaminDataInput input)
        {

            var query = CreateFilteredQuery(input);

            var args = new ExportVitaminDataArgs();
            args.Query = ApplySorting(query, input);

            _backgroundJobManager.Enqueue<ExportFieldDataJob, ExportVitaminDataArgs>(args);
        }

Одна из причин, по которой я хотел бы передать скомпилированный запрос, заключается в том, что хотелось бы сделать фоновое задание экспорта более универсальным c, чтобы его можно было использовать в других таблицах, просто получив запрос, затем я передам объект для сопоставления, а затем сгенерируем CSV.

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

Итак, мой вопрос: как передать запрос, чтобы его можно было использовать для выполнения фонового задания, а затем извлечь данные для экспорта в csv?

...