【问题标题】:Entity Framework SQL Query Execution实体框架 SQL 查询执行
【发布时间】:2010-01-14 15:10:05
【问题描述】:

使用实体框架,当我们对 2000 条需要 groupby 和其他计算的记录执行查询时,查询是否在服务器上执行,并且仅将结果发送到客户端,还是全部发送到客户端然后执行?

这使用 SQL Server。

我正在研究这个问题,因为我将要启动一个项目,在该项目中需要对一个庞大的数据库进行大量查询,并且想知道如果使用实体框架。

【问题讨论】:

  • 视情况而定!可以发一些代码吗?
  • 我还不能发布任何代码,因为这是我开始这个项目之前的研究。

标签: c# sql sql-server entity-framework


【解决方案1】:

我认为所有数据库查询都是在服务器端(数据库所在的位置!)完成的,并且结果会被传递。但是,在 Linq 中,您拥有所谓的 Delayed Execution(延迟加载),因此在您尝试访问之前不会真正检索到您的信息,例如调用 ToList() 或访问属性(相关表)。

如果需要,您可以选择使用 LoadWith 进行预加载。

因此,就性能而言,如果您真的只想为您的查询(具有相关表)访问数据库 1 次,我建议您使用 LoadWith 选项。但是,这确实取决于特定情况。

【讨论】:

【解决方案2】:

它总是在 SQL Server 上执行。这也意味着有时你必须改变它:

from q in ctx.Bar
where q.Id == new Guid(someString)
select q

Guid g = new Guid(someString);
from q in ctx.Bar
where q.Id == g
select q

这是因为构造函数调用无法转换为 SQL。

【讨论】:

  • 这样的查询是在SQL server 中执行,还是从DB 返回所有数据并在server 中过滤? var blog = context.Blogs .Where(b => b.Name == "ADO.NET Blog") .FirstOrDefault();
【解决方案3】:

Sql 的 groupby 和 linq 的 groupby 返回不同形状的结果。

Sql 的 groupby 返回键和聚合(没有组成员)

Linq 的 groupby 返回键和组成员。

如果您使用这些组成员,则必须通过分组键(重新)获取它们。这可以导致每组数据库往返+1。

【讨论】:

    【解决方案4】:

    好吧,我前段时间也有同样的问题。 基本上:您的 linq 语句被转换为 sql 语句。但是:有些组会被翻译,有些则不会 - 取决于您如何撰写声明。
    所以是的 - 两者都是可能的

    示例:

    var a = (from entity in myTable where entity.Property == 1 select entity).ToList();
    

    var a = (from entity in myTable.ToList() where entity.Property == 1 select entity).ToList();
    

    【讨论】:

    • 调用 .ToList 或其他需要获取结果才能完成的操作会导致对查询进行评估。就像通过 IEnumerable/IQueryable 进行 foreach 一样。
    • 这就是重点……关键在于你如何写你的陈述……;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多