c# - Entity Framework Core:如何忽略 DbSet Find 方法的QueryFilters
问题描述
我正在使用全局查询过滤器,但不想将其应用于 DbSet.Find
方法。我不能使用.IgnoreQueryFilters
,因为它返回IQueryable
。.FirstOrDefault
由于性能原因,我也不想使用。
帮助表示赞赏。
解决方案
IDbSet<T>
您可以为可以“模拟”原始Find
方法查找流程的地方创建“查找”扩展方法。
public static async Task<T> FindAsync<T>(this IDbSet<T> source, Expression<Func<TSource,bool>> predicate)
where T : class, new()
{
// parameters validation if needed
return
source.Local.SingleOrDefault(predicate)
?? await source.IgnoreQueryFilters().SingleOrDefaultAsync(predicate);//.ConfigureAwait(false);
}
我没有测试它,但可能工作得很好。
如果您有一些通用的表键约定,您甚至可以使用更通用的扩展方法。
public static async Task<T> FindAsync<T, TKey>(this IDbSet<T> source, TKey id)
where T : class, new()
where TKey : IEquatable<TKey>
{
// parameters validation if needed
return
source.Local.SingleOrDefault(e => e.Id == id)
?? await source.IgnoreQueryFilters().SingleOrDefaultAsync(e => e.Id == id);//.ConfigureAwait(false);
}
希望能帮助到你。
推荐阅读
- go - 为什么 goroutine 只作为等待组的一部分运行一次
- javascript - 如何使用表中的检查值使用javascript制作另一个表
- php - 拒绝用户“SELECT * FROM users”访问,但它不是用户
- onesignal - 我应该在 laravel 7 中将 https 站点的 oneSignal SDK 文件放在哪里以及如何在刀片文件中引用它们?
- google-apps-script - 如何在 Google 表格的特定列中获取最后填充的行?
- python - 如何获取另一列中每个值的列中值的平均值
- excel - 在范围内的任何单元格中查找值
- c# - 在运行时解析接口(就在使用之前)
- random - Rust:使用 gen_range 模拟 rand 函数
- android - 在 Android 中保存文件时如何更改 FileOutputStream 目录?