C# 从SQL调用不适用于IQueryable<;张力>;从实体框架核心2.2迁移到3.0后

C# 从SQL调用不适用于IQueryable<;张力>;从实体框架核心2.2迁移到3.0后,c#,entity-framework-core,entity-framework-core-3.0,C#,Entity Framework Core,Entity Framework Core 3.0,我正在动态地构建查询,我有一个方法接收一个可选的IOrderedQueryable。这段代码曾经与EF Core 2.2完美配合,但在迁移后停止了 IQueryable<T> query; if (spec.OrderedQueryable == null) { query = DbContext.Set<T>() .FromSqlRaw($"SELECT * FROM {tableName} WHERE RowVers

我正在动态地构建查询,我有一个方法接收一个可选的
IOrderedQueryable
。这段代码曾经与EF Core 2.2完美配合,但在迁移后停止了

IQueryable<T> query;

if (spec.OrderedQueryable == null)
{
    query = DbContext.Set<T>()
                     .FromSqlRaw($"SELECT * FROM {tableName} WHERE RowVersion > @p0", new[] { lastRowVersion });
}
else
{
    query = spec.OrderedQueryable;
    query = query.FromSql($"SELECT * FROM {tableName} WHERE RowVersion > @p0", new[] { lastRowVersion });
}
IQueryable查询;
if(spec.OrderedQueryable==null)
{
query=DbContext.Set()
.FromSqlRaw($“从{tableName}中选择*其中RowVersion>@p0”,新[]{lastRowVersion});
}
其他的
{
query=spec.OrderedQueryable;
query=query.FromSql($“SELECT*FROM{tableName},其中RowVersion>@p0”,new[]{lastRowVersion});
}

文档中说,
FromSql
已被
FromSqlRaw
替换,这是事实,它在
DbSet
上有效,但在
IQueryable
上无效。关于如何使用EF Core 3.0实现这一点,有什么提示吗?

我是如何从EF Core 3.0中的文档中获得它的,你不能这样做

在EF Core 3.0之前,可以在查询中的任何位置指定FromSql方法

新行为

从EF Core 3.0开始,新的FromSqlRaw和FromSqlInterpolated方法(替换FromSql)只能在查询根上指定,即直接在数据库集上指定。尝试在其他任何地方指定它们将导致编译错误

为什么

在DbSet之外的任何地方指定FromSql都没有任何附加意义或附加值,并且在某些场景中可能会导致歧义

缓解措施


FromSql调用应该被移动到直接应用它们的数据库集上。

我是如何从ef core 3.0中的doc获得它的,你不能这样做

在EF Core 3.0之前,可以在查询中的任何位置指定FromSql方法

新行为

从EF Core 3.0开始,新的FromSqlRaw和FromSqlInterpolated方法(替换FromSql)只能在查询根上指定,即直接在数据库集上指定。尝试在其他任何地方指定它们将导致编译错误

为什么

在DbSet之外的任何地方指定FromSql都没有任何附加意义或附加值,并且在某些场景中可能会导致歧义

缓解措施


FromSql调用应该被移动到直接应用它们的数据库集上。

不能将插值($)与FromSqlRaw()一起使用,而应将其替换为
.FromSqlRaw(“从@tableName中选择*行版本>@p0”,tableName,p0})不能将插值($)与FromSqlRaw()一起使用,而应将其替换为 .FromSqlRaw(“SELECT*FROM@tableName WHERE RowVersion>@p0”,tableName,p0})

在我的案例中不正确“在DbSet以外的任何地方指定FromSql都没有附加意义或附加值”,尽管这不是最干净的代码,但通过传递查询()作为一个参数。在我的案例中不适用“在数据库集以外的任何地方指定FromSql都没有任何附加意义或附加值”,尽管这不是最干净的代码,但通过将查询()作为参数传递,可以避免编写大量方法。