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= 则抛出一些有意义的东西] 不受支持。
我正在使用 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= 则抛出一些有意义的东西] 不受支持。