首页 > 解决方案 > 如何从 LINQ 构建 EF Core 查询,然后将查询传递给要执行的后台作业

问题描述

如何从 LINQ 构建查询,然后发送到后台作业以执行?我正在使用带有 Hangfire 的 EF Core 作为我的后台作业管理器。我尝试传入一个 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);
        }

我想传递编译查询的一个原因是因为我想让导出后台作业更通用,以便它可以被另一个其他表使用,只需接收一个查询,然后我将传递对象以映射到,然后生成 CSV。

此外,在将其传递给后台作业之前,我无法将其枚举到列表中,因为当记录数很大时它会变得非常慢。

所以我的问题是,我如何传入查询,以便它可以被后台作业使用,执行,然后检索要导出到 csv 的数据?

标签: entity-frameworklinqasp.net-coreaspnetboilerplatehangfire

解决方案


推荐阅读