提问人:santosh kumar patro 提问时间:11/1/2023 最后编辑:Guru Stronsantosh kumar patro 更新时间:11/1/2023 访问量:41
使用 EF 时出现类型转换问题。在 C# 中使用 Func 进行 CompileAsyncQuery,用于返回可为 null 的类型
Typecasting issue when using EF.CompileAsyncQuery with Func in C# for returning nullable type
问:
我在使用 EF 时遇到类型转换错误。CompileAsyncQuery 定义一个函数,该函数应返回可为 null 的类型 (Memo?)。我正在使用的代码片段如下:
public static readonly Func<AppDbContext, int, int, CancellationToken, Task<Memo?>> GetDataByIdAsync =
EF.CompileAsyncQuery((AppDbContext appDbContext, int memoId, int Id, CancellationToken cancellationToken) =>
appDbContext.Set<Memo>()
.Include(d => d.FocusAreas)
.FirstOrDefaultAsync(d => d.MemoId == memoId && d.CreateUserId == Id, cancellationToken)
);
我遇到的错误是:
无法将类型“System.Func<Infrastructure.Data.AppDbContext, int, int, System.Threading.CancellationToken, System.Threading.Tasks.Task<System.Threading.Tasks.Task<Infrastructure.Entities.Memo>>>”隐式转换为“System.Func<Infrastructure.Data.AppDbContext, int, int, System.Threading.CancellationToken, System.Threading.Tasks.Task<Infrastructure.Entities.Memo?>>'
我不确定如何解决此问题。如何修改代码以确保返回的类型与可为 null 的 Memo 一致?类型?
任何人都可以通过提供他们的指导来帮助我
答:
1赞
Guru Stron
11/1/2023
#1
使用物化操作的非异步版本:
public static readonly Func<AppDbContext, int, int, CancellationToken, Task<Memo?>> GetDataByIdAsync =
EF.CompileAsyncQuery((AppDbContext appDbContext, int memoId, int Id, CancellationToken _) =>
appDbContext.Set<Memo>()
.Include(d => d.FocusAreas)
.FirstOrDefault(d => d.MemoId == memoId && d.CreateUserId == Id));
EF.CompileAsyncQuery 重载接受 for ,而不是Expression<Func<..., TResult>>
queryExpression
Expression<Func<..., Task<TResult>>>
评论
0赞
santosh kumar patro
11/1/2023
感谢 Stron @Guru 的回复。上面的代码没有使用 CancellationToken。这是否意味着我们不能将 CancellationToken 与 EFCore 编译的查询一起使用
0赞
Guru Stron
11/1/2023
@santoshkumarpatro不,这并不意味着。您提供的表达式不会直接执行,据我了解,EF 设计团队似乎决定使用 中的参数来区分可取消和不可取消的重载,因此参数是虚拟的。基于快速浏览 - 在执行实际查询时,应使用传递给返回函数的取消令牌。CancellationToken
queryExpression
CancellationToken
queryExpression
1赞
santosh kumar patro
11/1/2023
感谢 Stron @Guru 的详细解释。我现在能够解决这个问题:)
评论