小编Dun*_*nge的帖子

Entity Framework Core CompileAsyncQuery 语法来执行返回列表的查询?

关于编译异步查询的在线文档和示例有点稀疏,所以我不妨在这里寻求指导。

假设我有一个像这样的存储库模式方法来查询表中的所有条目:

public async Task<List<ProgramSchedule>> GetAllProgramsScheduledList()
{
    using (var context = new MyDataContext(_dbOptions))
    {
        context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
        return await context.ProgramsScheduledLists.ToListAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用。

现在我想做同样的事情,但是使用异步编译的查询

我设法编译它的一种方法是使用以下语法:

static readonly Func<MyDataContext, Task<List<ProgramSchedule>>> GetAllProgramsScheduledListQuery;

static ProgramsScheduledListRepository()
{
    GetAllProgramsScheduledListQuery = EF.CompileAsyncQuery<MyDataContext, List<ProgramSchedule>>(t => t.ProgramsScheduledLists.ToList());
}

public async Task<List<ProgramSchedule>> GetAllProgramsScheduledList()
{
    using (var context = new MyDataContext(_dbOptions))
    {
        context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
        return await GetAllProgramsScheduledListQuery(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

但在运行时会抛出此异常:

System.ArgumentException: Expression of type 'System.Collections.Generic.List`1[Model.Scheduling.ProgramSchedule]' cannot be used for return type 'System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[Model.Scheduling.ProgramSchedule]]'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我使用任何其他运算符(例如 SingleOrDefault),它工作正常。它只是返回列表时出现问题。

为什么?

async-await entity-framework-core

4
推荐指数
1
解决办法
3324
查看次数

标签 统计

async-await ×1

entity-framework-core ×1