关于编译异步查询的在线文档和示例有点稀疏,所以我不妨在这里寻求指导。
假设我有一个像这样的存储库模式方法来查询表中的所有条目:
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),它工作正常。它只是返回列表时出现问题。
为什么?