【问题标题】:Which way of implemeting conditions in Entity Framework has a better performance?Entity Framework 中哪种实现条件的方式性能更好?
【发布时间】:2018-11-21 07:24:07
【问题描述】:

当我想对数据库实体做一些验证的时候,我可以想到两种方法:

1:检索字段值,然后在应用程序中进行计算:

if (dbContext.Coupons.Where(c=> c.Id == couponId).Select(c=> c.ExpirationDate).Single() <= DateTime.Now)

2:在查询中进行计算(在 'Select()' 方法中),然后检索结果:

if (dbContext.Coupons.Where(c=> c.Id == couponId).Select(c=> c.ExpirationDate <= DateTime.Now).Single())

【问题讨论】:

  • 如果你只是用一些数据做一个基准测试会不会快很多?然后你就会知道哪一个更好,性能明智
  • 如果您的 couponId 是主键(好吧,根据您的 where->select->single - 它是),而不是 .Where(c=&gt; c.Id == couponId) 您可以使用 Coupons.Find(couponId).ExpirationDate &lt;= DateTime.Now
  • @SeM Find 方法从数据库中检索整行并实际上杀死了性能。
  • @AmirHosseinAhmadi 这取决于您的行是否存在于缓存中。

标签: c# sql entity-framework linq-to-sql linq-to-entities


【解决方案1】:

我建议,在 linq 或从 db(SQL 查询)或对象中获取值的进程中执行的每个验证、过滤器或进程。

例如:

如果表中有10条数据,使用第二种方式,应用会将所有数据导入本地内存并在应用内部过滤。

但如果你使用第一种方式,应用程序只导入已经过滤的数据(例如过滤过程后只有4个数据)

如果您的数据超过 10K,也许您会看到不同

【讨论】:

    【解决方案2】:

    这将为您提供最佳性能。

    if (dbContext.Coupons.Any(c => c.Id == couponId && c.ExpirationDate <= DateTime.Now))
    

    【讨论】:

    • 你的方法和我的第二种方法有什么区别? (他们都返回一个布尔值并做同样的事情)
    • @AmirHosseinAhmadi 使用 Where () 创建了一个增加性能影响的迭代器,而使用带有谓词的 any () 可以在没有迭代器的情况下执行其任务。此外,如果您的条件将找到超过 1 条记录,您将获得例外。
    • 首先,“Where()”方法创建了一个IQueryable,它将被翻译成SQL,在这两种方式中,我们生成了相同的SQL(不完全相同,有细微差别)。其次,序列中肯定只有1个元素,因为条件是基于主键的。
    • @AmirHosseinAhmadi 据我所知,使用 any() Linq 会生成带有存在的 SQL 查询并返回 true 或 false,因此不需要您在问题中提到的额外条件。
    猜你喜欢
    • 2012-09-28
    • 2021-08-28
    • 1970-01-01
    • 2010-11-05
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多