Как построить запрос из 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?