【问题标题】:Is it possible to execute custom SQL query using EF7是否可以使用 EF7 执行自定义 SQL 查询
【发布时间】:2016-09-29 15:37:42
【问题描述】:

我决定将我的一个项目迁移到 Entity Framework 7 (rc1-final)。我的目标是 SQL Server,并且还安装了 EntityFramework.MicrosoftSqlServer 包。

我只有一个问题:似乎我无法执行自定义 SQL 查询以从 DB 中获取一些对象。

DatabaseFacade 对象(可以通过DbContext.Database 属性访问)提供了扩展方法ExecuteSqlCommand(不返回任何内容),但它不提供允许获取对象的SqlQuery<T> 方法。这两种方法在旧的 EF 6 中都可用,但新的 EF 7 只声明了第一个。

那么,SqlQuery<T> 方法是否仍然存在(但已移动/重命名)还是已从新的 EF 实现中完全删除?

当然,绝对有可能以冗长的方式解决它(使用SqlCommand 及其ExecuteReader 方法),但我更愿意避免它。

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    EntityFramework.Relational 公开了以下扩展方法;

    public static IQueryable<TEntity> FromSql<TEntity>(
            [NotNull] this IQueryable<TEntity> source,
            [NotNull] [NotParameterized] string sql,
            [NotNull] params object[] parameters)
            where TEntity : class
    

    所以你可以这样做;

    myDatabaseContext.Customers.FromSql("SELECT * FROM Customers WHERE Name='p0'", "timothy");
    

    【讨论】:

    • 谢谢,但我已经知道该方法,但不幸的是,它需要 IQueryable 作为输入参数。据我了解,该方法应与一些 DbSet 一起使用,而这些 DbSet 又应在 DbContext 中定义。我的情况略有不同 - 我想获取我的 DbContext 中不存在的对象(即,只需执行查询并为每个返回的行创建 T 类型的对象)。
    • 在这种情况下,只需像this answer 那样使用底层的SqlCommand。
    • 实际上我现在正在使用这种方法(Command + ExecuteReader)。与缺少的 SqlQuery 相比,它是冗长的,但它当然可以工作。顺便说一句,感谢您的时间和回答 - 这绝对是有用的 - 非常感谢。
    【解决方案2】:

    要在 EF7 中执行自定义 SQL 查询,您可以创建一个“假”表,该表的结构类似于您的 SQL 查询的结构。

    示例:您的查询是:“select a.A, b.B from A,B where a.b_id=b.id”。假表将包含 2 列,如 A、B。 在您的程序中,您可以这样做:

    var result = myDatabaseContext.FakeTables.FromSql("select a.A, b.B from A,B where a.b_id=b.id");
    

    【讨论】:

      【解决方案3】:

      看起来您可以在传递给 Up 和 Down 方法的 migrationBuilder 对象上使用 Sql 方法。至少在 rc2 中。

      protected override void Up(MigrationBuilder migrationBuilder)
      {
          ...
          migrationBuilder.Sql("<Sql here>");
      }
      

      【讨论】:

      • EF Core RTM 版本中似乎不存在此方法“migrationBuilder.Sql”。有谁知道等价的吗?
      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2012-02-22
      • 2013-06-05
      • 1970-01-01
      • 2011-11-17
      • 2021-01-26
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多