【问题标题】:Calling FromSql Not working on IQueryable<TEntity> after migration from Entity Framework core 2.2 to 3.0从 Entity Framework 核心 2.2 迁移到 3.0 后,调用 FromSql 在 IQueryable<TEntity> 上不起作用
【发布时间】:2020-02-03 19:24:45
【问题描述】:

我正在动态构建我的查询,我有一个接收IOrderedQueryable&lt;T&gt; 的方法,这是可选的。此代码过去可以与 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&lt;T&gt;。关于如何使用 EF Core 3.0 实现这一点的任何提示?

【问题讨论】:

    标签: c# entity-framework-core entity-framework-core-3.0


    【解决方案1】:

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

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

    新行为

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

    为什么

    在 DbSet 以外的任何位置指定 FromSql 没有附加意义或附加值,并且在某些情况下可能会导致歧义。

    缓解措施

    FromSql 调用应该直接移动到它们应用到的 DbSet 上。

    【讨论】:

    • 不适用于我的情况“在 DbSet 以外的任何地方指定 FromSql 没有附加意义或附加值”,虽然这不是最简洁的代码,但通过传递query() 作为参数。
    【解决方案2】:

    您不能将插值($) 与 FromSqlRaw() 一起使用,而是将其替换为 .FromSqlRaw("SELECT * FROM @tableName WHERE RowVersion > @p0", tablename,p0 })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2018-03-29
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多