【问题标题】:How many database calls in this EF query?此 EF 查询中有多少个数据库调用?
【发布时间】:2020-04-17 14:10:49
【问题描述】:

我正在接管某人的代码并遇到了这个实体框架查询,但我从未见过它以这种方式完成。每次调用 .FirstOrDefault 时不是都有数据库查询吗?那么在这种情况下,会有 4 个数据库查询,这意味着 5 个打开/关闭到数据库的连接?只是想了解这是否是一种无效的方法,在我看来是这样。

var record = from e in ctx.bio_employee.Where(x => x.emp_id == emp_id)
             select new
             {
                  ta.ta_system
                 ,ta.bio_consent_flag
                 ,e.bio_consentform_rid
             };


if (record.FirstOrDefault() != null) 
{
    vm.TASystem = record.FirstOrDefault().ta_system;
    vm.bio_consent_flag = record.FirstOrDefault().bio_consent_flag == null ? "N" : record.FirstOrDefault().bio_consent_flag.Trim().ToUpper();
    vm.employee_bio_consentform_rid = record.FirstOrDefault().bio_consentform_rid;
}

【问题讨论】:

  • 经过一番研究,我推测这确实会对数据库产生 4 个查询。
  • 这显然是不好的做法。避免重复 FirstOrDefault 有几个原因: 1. 当局部变量可能减少到 1 次时,该方法几乎肯定会被调用多次。 2. 数据库记录可能会在调用之间发生变化,这意味着结果可能由于删除、插入甚至物理重新排序(查询中未指定排序)而发生变化,因此后续指令可以处理不同的记录。 3.代码清晰和维护,顺便说一句,FirstOrDefault出现5次。在所有指令期间都会保留与数据库的连接。

标签: c# entity-framework linq


【解决方案1】:

虽然连接池将重用单个连接,但它会分别执行 4 或 5 次相同的查询。应该是

var query = from e in ctx.bio_employee.Where(x => x.emp_id == emp_id)
             select new
             {
                  ta.ta_system
                 ,ta.bio_consent_flag
                 ,e.bio_consentform_rid
             };

var result = query.FirstOrDefault();

if (result != null) 
{
    vm.TASystem = result .ta_system;
    vm.bio_consent_flag = result .bio_consent_flag == null ? "N" : result .bio_consent_flag.Trim().ToUpper();
    vm.employee_bio_consentform_rid = result.bio_consentform_rid;
}

【讨论】:

  • 同意。我只是想确认这将像我假设的那样多次访问数据库。您的答案实际上就是我将要转换的内容,但只是想确保我没有遗漏一些我不知道的东西,以便我可以捍卫我做出改变的理由。
  • 查看答案,我将重新表述我的陈述,因为它将重用我没有意识到的连接。所以它进行了 4 或 5 次查询调用,但它对性能的影响并没有我想象的那么大,因为它没有打开/关闭连接 4 或 5 次。尽管如此,当它只需要发生一次时,它对数据库的调用是不必要的。我敢肯定,多个查询仍然会对性能造成影响,但它会非常轻微,在大多数情况下不会被注意到。另一方面,如上所述的代码清晰性和维护性仅证明了更改是合理的。
  • 是的。查询和集合应在代码中明确区分。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多