微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决DbSet<TableName> 不包含“Where”的定义和最佳扩展方法重载

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

DbSet 不包含 'Where' 的定义和最佳扩展方法重载 'Queryable.Where(IQueryable,Expression>)' 需要一个接收器输入 IQueryable

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

即使在这种情况下您已经有效地断言 T = TableName,您也不能对 Expression<Func<T,bool>> 运行 DbSet<TableName>

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

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

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

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

从那里,您可以检查方法中的 <T> 以断言传入的唯一表是您的上下文中受支持的 DbSet,如果为不受支持的表调用它,则会抛出一些有意义的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。