C# DbSet<;表名>;不包含';其中';而最好的扩展方法是重载

C# DbSet<;表名>;不包含';其中';而最好的扩展方法是重载,c#,entity-framework,linq,polly,C#,Entity Framework,Linq,Polly,我正在使用Polly包装所有数据库命令以防连接错误,但在尝试编写自定义方法来运行Polly代码时,我遇到了上述错误。我使用的是EntityFramework6,我认为我做的每件事都是对的,但显然我遗漏了一些东西。这是伪代码,但希望您能理解 DbSet不包含对“Where”和最佳扩展方法重载“Queryable”的定义。Where(IQueryable,Expression)需要IQueryable类型的接收器 公共静态异步任务HandleNetworkTask(表达式,T表),其中T:class

我正在使用Polly包装所有数据库命令以防连接错误,但在尝试编写自定义方法来运行Polly代码时,我遇到了上述错误。我使用的是EntityFramework6,我认为我做的每件事都是对的,但显然我遗漏了一些东西。这是伪代码,但希望您能理解

DbSet不包含对“Where”和最佳扩展方法重载“Queryable”的定义。Where(IQueryable,Expression)需要IQueryable类型的接收器

公共静态异步任务HandleNetworkTask(表达式,T表),其中T:class
{
尝试
{
使用var context=new dbconfig();
int maxRetries=5;
var retryPolicyAsync=Policy.Handle().WaitAndRetryAsync(maxRetries,RetryAttract=>TimeSpan.FromSeconds(1),(异常,TimeSpan,retryCount,上下文)=>
{
睡眠(6000);
});
var fallbackpolicyanc=Policy.Handle().FallbackAsync(fallbackValue:null,onFallbackAsync:async(exc,con)=>wait ThrowExceptionInfo(exc.Exception));
var retryPolicy=Policy.Handle().WaitAndRetry(maxRetries,retrytry=>TimeSpan.FromSeconds(1),(异常,TimeSpan,retryCount,上下文)=>
{
睡眠(6000);
});
var fallbackPolicy=Policy.Handle();
开关(表)
{
案例表名:
return wait fallbackPolicyAsync.WrapAsync(retryPolicyAsync).ExecuteAsync(async()=>
{
返回wait context.TableName.Where(表达式).toListSync();
});
打破
违约:
打破
}
}
捕获(例外情况除外)
{
ThroweExceptionInfo(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();
                    });
开关(表)
{
案例表名:
return wait fallbackPolicyAsync.WrapAsync(retryPolicyAsync).ExecuteAsync(async()=>
{
返回wait context.TableName.Where(表达式).toListSync();
});
即使在此场景中有效地断言了t=TableName,也不能对
DbSet
运行
表达式

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

return await context.Set<T>.Where(expression).ToListAsync();
返回wait context.Set.Where(expression.toListSync();

我会考虑删除“表”参数,只需用泛型调用中的类型调用方法:

var list = await HandleNetworkTask<TableName>(x => x.Name == name && x.Date == date, true);
var list=await HandleNetworkTask(x=>x.Name==Name&&x.Date==Date,true);
从那里,您可以检查方法中的
,断言传入的唯一表是上下文中受支持的DbSet,如果为不受支持的表调用它,则抛出一些有意义的内容