【问题标题】:How do I make a raw sql query in EF Core 2.2?如何在 EF Core 2.2 中进行原始 sql 查询?
【发布时间】:2020-03-09 02:38:13
【问题描述】:

我正在使用 dotnet core 2.x 应用程序。

我们有一堆“代码优先”实体,在 DBContext 中每个实体都有一个 DBSet。

示例:

public class MyContext : DBContext
{
  public MyContext(DBContextOptions<MyContext> options) : base (options) {}

  public DbSet<Models.MyTable> MyTable { get; set; }
  ...

到目前为止,一切都很好。现在我想做这个查询:

SELECT DISTINCT MyColumn from dbo.MyTable

应该很容易吧? “经典 EF”有 dbData.Database.SqlQuery&lt;SomeModel&gt;,但在 EF Core 2.x 中,我应该能够执行以下操作:

var myList = _context.MyTable.FromSql("SELECT DISTINCT MyColumn from dbo.MyTable").ToList();

这失败了:

错误 CS1061:DbSet 不包含 FromSql 的定义...

我读到我可能需要安装一个额外的包“Microsoft.EntityFrameworkCore.Relational”。但是 NuGet > Browse 只向我展示了 v3.1(没有 2.x 版本)......并且安装这个包想要引入许多其他依赖项(!)

问题:

有什么方法可以使用 EF Core 2.x 进行简单的 SQL 查询...

...不需要“select *”(带入整个表格!)并且不需要下载和安装一堆额外的 NuGet依赖?

【问题讨论】:

  • 嗯,没有等效的 EF6 SqlQuery&lt;T&gt;。 FromSql 需要定义包含返回列的查询类型。有2.x Relational package,比如2.2.6。
  • 但是对于这样的简单查询,您不需要原始 SQL,LINQ 就足够了,var myList = _context.MyTable.Select(e =&gt; e.MyColumn).Distinct().ToList(); 将生成并执行完全相同的 SQL,而无需额外的包/类型。
  • @Ivan Stoev:1)我后来在 NuGet 网页上找到了 2.2.x 关系包(我不知道为什么“NuGet Browse”没有显示它们)。我很高兴没有“一百万个依赖项”。 2)关于 FromSql 需要定义的查询类型是正确的:我遇到了这个问题,但还没有弄清楚如何最好地处理它。 3)我会试试LINQ。听起来不错的建议 - 谢谢!

标签: c# entity-framework-core


【解决方案1】:

我想你真正想要的是FromSqlRawhttps://docs.microsoft.com/en-us/ef/core/querying/raw-sql

无论如何,如果您在 EF 中,则不需要为这样一个简单的查询执行此操作。 EF select 不需要您从整个表架构中获取数据。您可以使用 .select 指定所需的确切列。

请参阅https://www.brentozar.com/archive/2016/09/select-specific-columns-entity-framework-query/ 了解更多信息。

【讨论】:

  • 不幸的是,1) FromSqlRaw 适用于 EF 3.x(它也弃用了“FromSql”)。不过,我实际上尝试过 - 并得到了相同的“CS1061”编译错误。 2)您引用的 sn-p 是“EF Classic”;我认为它不适用于 EF Core。那是因为它的 DBContext 使用了一个无参数构造函数……而 EF Core 想要一个注入 DBContextOptions 的 DBContext 构造函数。不过还是谢谢你:)
  • 我们在 ef core 中使用了 .select。 .select 绝对允许您选择列。我和我们做这件事的人谈过,他说要让 .fromsql 工作,他实际上必须为它创建一个数据库集。
  • 你是对的。我放弃了 FromSql(现在在 EF 3.x 中称为“FromSqlRaw”)。由于几个恼人的原因:a) 我必须引入一个无关的依赖项,b) 我还必须定义一个无关的 DbSet,最后 c) 这反过来意味着定义一个完全不必要的模型。哎呀! EF Core 并没有使使用 SqlReader 变得更容易 正如您所说的,解决方案是 LINQ Select()。感谢 Ivan Stoev 为我指明了正确的方向!
【解决方案2】:

谢谢你,伊万·斯托耶夫。解决方案是使用 LINQ“选择”:

var myList = _context.MyTable.Select(e => e.MyColumn).Distinct().ToList();

这就像一个魅力......它确实不需要需要任何外部依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2019-07-22
    • 2020-01-09
    • 2021-12-10
    • 2019-05-29
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多