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都没有任何附加意义或附加值”,尽管这不是最干净的代码,但通过将查询()作为参数传递,可以避免编写大量方法。