[英]Calling FromSql Not working on IQueryable<TEntity> after migration from Entity Framework core 2.2 to 3.0
我正在动态构建我的查询,我有一个接收可选的IOrderedQueryable<T>
的方法。 此代码曾经与 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 });
}
文档说FromSql
已被替换为FromSqlRaw
,这是真的,这适用于DbSet
但不适用于IQueryable<T>
。 关于如何使用 EF Core 3.0 实现这一点的任何提示?
我是如何从 ef core 3.0 中的文档获得的,你不能这样做。
在 EF Core 3.0 之前,可以在查询中的任何位置指定 FromSql 方法。
新行为
从 EF Core 3.0 开始,新的 FromSqlRaw 和 FromSqlInterpolated 方法(替换 FromSql)只能在查询根上指定,即直接在 DbSet<> 上。 尝试在其他任何地方指定它们将导致编译错误。
为什么
在 DbSet 以外的任何位置指定 FromSql 没有附加意义或附加值,并且在某些情况下可能会导致歧义。
缓解措施
FromSql 调用应直接移动到它们应用的 DbSet 上。
您不能将插值($)与 FromSqlRaw() 一起使用,而是将其替换为.FromSqlRaw("SELECT * FROM @tableName WHERE RowVersion > @p0", tablename,p0 })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.