如何解决DbSet<TableName> 不包含“Where”的定义和最佳扩展方法重载
我正在使用 Polly 包装我的所有数据库命令,以防出现连接错误,但在尝试编写自定义方法来运行 Polly 代码时出现上述错误。我正在使用 Entity Framework 6,我认为我做的一切都是正确的,但显然我错过了一些东西。这是伪代码,但希望你能明白。
DbSet
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 举报,一经查实,本站将立刻删除。