【问题标题】:Dapper-like Multi Query with EF Core使用 EF Core 的类似 Dapper 的多查询
【发布时间】:2020-09-18 13:46:34
【问题描述】:

使用 dapper 可以很容易地一次运行多个查询:

string sql = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = @InvoiceID;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
    {
        var invoice = multi.Read<Invoice>().First();
        var invoiceItems = multi.Read<InvoiceItem>().ToList();
    }
}

如何使用 EFCore 进行归档?

我找到了类似的解决方案

var query = from _ in db.Invoices
            select new {
                Invoice = db.Invoices.Single(x=>x.InvoiceId == 1),
                InvoiceItems = db.InvoiceItems.Where(x=>x.InvoiceId == 1),
            }

但这不起作用。 我可以在分析中看到这在两个连接中运行两个查询。我什至可以看到连接没有被重用(为什么?)。

如何使用 EFCore 运行多个查询这是 EFCore 的一大性能缺陷吗? 谢谢。

【问题讨论】:

  • 为什么要关心是一批还是两批?为什么不使用急切加载:例如db.Invoces.Include(i =&gt; i.InvoiceItems).Where(i =&gt; InvoiceId ==1);
  • 你是对的,这里的样本不是最好的。该问题应解释为“如何对同一张或不同一张表运行多个查询”。我有多个目的,例如多次计数。但是像 stackoverflow.com/questions/51114437/… 这样的解决方案不适用于 EFCore,因为在这种情况下 GroupBy 没有映射。

标签: entity-framework


【解决方案1】:

免责声明:我是项目的所有者Entity Framework Plus

您目前正在寻找Query Future 功能:https://entityframework-plus.net/ef-core-query-future

此功能通常称为Future,因为所有查询都将在执行第一个即时操作时实现,例如ToList

using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntitiesContext();

// CREATE a pending list of future queries
var futureCountries = ctx.Countries.Where(x => x.IsActive).Future();
var futureStates = ctx.States.Where(x => x.IsActive).Future();

// TRIGGER all pending queries in one database round trip
// SELECT * FROM Country WHERE IsActive = true;
// SELECT * FROM State WHERE IsActive = true
var countries = futureCountries.ToList();

// futureStates is already resolved and contains the result
var states = futureStates.ToList();

在线示例:https://dotnetfiddle.net/8gwESn

编辑:回答评论

但不支持异步

当然支持异步,支持任何即时方法,例如ToListAsync()

但是,请确保第一个立即方法已完全执行(例如使用 await)。

【讨论】:

  • 在某些情况下可能会很好,是的。但是不支持异步?在您的文档中找不到提示。
  • 我尝试了你的 Lib 并决定不使用它。该库缺少异步支持、事务参数等简单的东西。一个很大的优势是 FromQueryAsync,但不幸的是它完全无视 EF Core 的范式。如果你能在这里得到更多的排队,那就太好了:-)
【解决方案2】:

问题是:MultiActiveResults 是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 2021-10-21
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多