DbSet<TableName> 不包含 'Where' 的定义和最佳扩展方法重载

DbSet<TableName> does not contain a definition for 'Where' and the best extension method overload

我正在使用 Polly 包装我的所有数据库命令以防出现连接错误,但是在尝试将自定义方法写入 运行 Polly 代码时出现上述错误。我正在使用 Entity Framework 6,我认为我做的一切都是正确的,但显然我错过了一些东西。这是伪代码,但希望你明白了。

DbSet< TableName > does not contain a definition for 'Where' and the best extension method overload 'Queryable.Where< T >(IQueryable< T >, Expression<Func<T, bool>>)' requires a receiver of type IQueryable< T >

public static async Task<List<T>> HandleNetworkTask<T>(Expression<Func<T, bool>> expression, T table) where T : class
{
    try
    {
        using var context = new dbconfig();
        int maxRetries = 5;

        var retryPolicyAsync = Policy<T>.Handle<Exception>().WaitAndRetryAsync(maxRetries, retryAttempt => TimeSpan.FromSeconds(1), (exception, timeSpan, retryCount, context) =>
        {
            Thread.Sleep(6000);
        });
        var fallbackPolicyAsync = Policy<T>.Handle<Exception>().FallbackAsync(fallbackValue: null, onFallbackAsync: async (exc, con) => await ThrowExceptionInfo(exc.Exception));

        var retryPolicy = Policy<T>.Handle<Exception>().WaitAndRetry(maxRetries, retryAttempt => TimeSpan.FromSeconds(1), (exception, timeSpan, retryCount, context) =>
        {
            Thread.Sleep(6000);
        });
        var fallbackPolicy = Policy<T>.Handle<Exception>().Fallback(fallbackValue: null, onFallback: (exc, con) => ThrowExceptionInfo(exc.Exception).GetAwaiter().GetResult());

        switch (table)
        {
            case TableName:
                return await fallbackPolicyAsync.WrapAsync(retryPolicyAsync).ExecuteAsync(async () => 
                    {
                        return await context.TableName.Where<T>(expression).ToListAsync();
                    });
                break;
            default:
                break;
        }
    }
    catch (Exception ex)
    {
        ThrowExceptionInfo(ex);
    }
}

这就是我在代码中调用方法的方式:

var list = await HandleNetworkTask(x => x.Name == name && x.Date == date, new TableName(), true);

说到泛型,我认为这种代码是非法的。

        switch (table)
        {
            case TableName:
                return await fallbackPolicyAsync.WrapAsync(retryPolicyAsync).ExecuteAsync(async () => 
                    {
                        return await context.TableName.Where<T>(expression).ToListAsync();
                    });

你不能 运行 Expression<Func<T, bool>> 反对 DbSet<TableName> 即使你在这种情况下有效断言 T = TableName。

你可以做的是删除整个 table 检查(除了断言它是一个有效的实体 table)并执行:

return await context.Set<T>.Where(expression).ToListAsync();

我会考虑删除“table”参数,并在通用调用中使用 Type 调用您的方法:

var list = await HandleNetworkTask<TableName>(x => x.Name == name && x.Date == date, true);

从那里您可以在方法中检查 <T> 以断言传入的唯一 table 是上下文中受支持的 DbSet,如果它被调用 [=26= 则抛出一些有意义的东西] 不受支持。