异步运行多个Linq查询

本文关键字:Linq 查询 运行 异步 | 更新日期: 2023-09-27 18:17:58

我正试图找出如何在我的应用程序的数据层正确使用async/await并行执行多个数据库调用。

我正在使用实体框架和Linq做我的数据调用。

数据层可以从任何应用程序类型(MVC Web App, Web API Project, Win from, Windows Service等)调用-因此该方法的结果应该是单个对象。

    public static async void GetLedger(long id, DateTime StartDate, DateTime EndDate)
    {
        var task_1 = DoComplexDBCallAsync1();
        var task_2 = DoComplexDBCallAsync2();
        var task_3 = DoComplexDBCallAsync3();
        var task_4 = DoComplexDBCallAsync4();
        var task_5 = DoComplexDBCallAsync5();
        await Task.WhenAll(task_1, task_2, task_3, task_4, task_5);
        var result = ProcessAndMergeResultsFromAllDBCalls(task_1.Result, task_2.Result, task_3.Result, task_4.Result, task_5.Result);
        return result;
    }
    private static async Task<List<SomeComplexType>> DoComplexDBCallAsync1(long id)
    {
        using (var metadata = DataAccess.getDesktopMetadata())
        {
            var accounts = await (from row in metadata.db_GLAccount
                                  where row.busID == id
                                  select row).ToListAsync();
            return accounts;
        }
    }

我如何改变上面的返回单个object而不是Task<> ?

我是否需要将其包装在另一个通过Task运行或RunSynchronously()调用GetLedger异步方法并返回结果的方法中?如果是这样的话,代码看起来会是什么样子,我需要注意什么吗?

这个场景中的最佳实践是什么?

异步运行多个Linq查询

您可以像下面这样使用await

    public static async Task<SomeObject> GetLedger(long id, DateTime StartDate, DateTime EndDate)
    {
        var task_1 = DoComplexDBCallAsync1();
        var task_2 = DoComplexDBCallAsync2();
        var task_3 = DoComplexDBCallAsync3();
        var task_4 = DoComplexDBCallAsync4();
        var task_5 = DoComplexDBCallAsync5();
        var result = ProcessAndMergeResultsFromAllDBCalls(await task_1, await task_2, await task_3, await task_4, await task_5);
        return result;
    }

'await'关键字将自动获取Task的结果,并在DB调用return时将其应用于变量。MSDN

然后调用

var result = await GetLedger(id, StartDate, EndDate);