首页 > 解决方案 > Entity Framework Core:如何忽略 DbSet Find 方法的QueryFilters

问题描述

我正在使用全局查询过滤器,但不想将其应用于 DbSet.Find方法。我不能使用.IgnoreQueryFilters,因为它返回IQueryable.FirstOrDefault由于性能原因,我也不想使用。

帮助表示赞赏。

标签: c#entity-framework-core

解决方案


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);
}

希望能帮助到你。


推荐阅读