gpt4 book ai didi

entity-framework - 从 DbSet 转换为 IEnumerable 是否会导致查询执行?

转载 作者:行者123 更新时间:2023-12-04 07:22:38 24 4
gpt4 key购买 nike

我的日志存储库中有以下两种方法。

public IEnumerable<Log> GetAll()
{
var db = new CasLogEntities();
return db.Logs;
}


public DbSet<Log> GetAllSet()
{
var db = new CasLogEntities();
return db.Logs;
}

唯一的区别是一个返回一个 IEnumerable 的 Log,另一个返回一个 Log 的 DbSet。

在我的 Assets Controller 中,我有以下代码
var allLogs = _logRepo.GetAllSet();
var Logs = (from log in allLogs
group log by log.DeviceId
into l
select new {DeviceId = l.Key, TimeStamp = l.Max(s => s.TimeStamp)}).ToList();

现在的问题是,根据我调用的 repo 方法之一,我在 group by 语句中获得了巨大的性能差异。
  • 返回 DbSet 的 getAllSet 快如闪电,
  • GetAll 返回 IEnumerable 真的很慢。

  • 任何人都可以解释这一点。我在想,在 GetAll 中将 DbSet 转换为 IEnumerable 会导致 Query 执行,因此我在大量内存集上进行分组。由于 GetAllSet 将查询执行推迟到“ToList()”,因此在服务器上按工作进行分组。

    这样对吗?有没有另一种方法来解释这一点?

    我更喜欢 GetAll 返回 IEnumerable,因为我更熟悉它并且它更容易测试。

    最佳答案

    不,转换为 IEnumerable<T>不会导致它执行。

    ,另一方面,将查询带入对象空间,因此当您投影到匿名类型时生成的 SQL 会有所不同。观看 SQL Server Profiler 以了解差异。

    这将解释性能差异。

    如果您返回 IQueryable<T>而不是 IEnumerable<T> ,SQL/性能应该是相同的。

    关于entity-framework - 从 DbSet 转换为 IEnumerable 是否会导致查询执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944687/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com