如何检查 any 连接和布尔检查之间的 entity framework 性能差异?

How to check entity framework performance difference between a join with any and a boolean check?

我想知道是否有人可以告诉我运行像这样的 EF 查询之间的性能差异(如果有的话)

var users = _context.Users.Include(p => p.Photos)
   .Where(p => p.Photos.Any())
   .AsQueryable();

还有这个

var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();

在 'User' 上检查布尔值 'HasPhoto' 还是在 ICollection 运行 上检查 .Any() 会比在大型数据集上更快更好? 怎么查看速度差异,用什么工具?

为什么不试试呢!您可以使用计时器来测量摊位的时间。尝试使用类似这样的东西

var watchOne = System.Diagnostics.Stopwatch.StartNew();
testOne();
watchOne.Stop();
var resOne = watchOne.ElapsedMilliseconds;

var watchTwo = System.Diagnostics.Stopwatch.StartNew();
testTwo();
watchTwo.Stop();
var resTwo= watchTwo.ElapsedMilliseconds;

public void testOne(){
    var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.Photos.Any())
    .AsQueryable();
}

public void testTwo(){
    var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();
}

从整体上考虑 Entity Framework 的性能注意事项:

  1. 加载和验证数据的成本¹ 相对成本
  2. 执行查询也有一个¹ 相对成本

¹[总成本的增加与查询 return 对象的数量成正比。

考虑到两者

var users = _context.Users.Include(p => p.Photos)
   .Where(p => p.Photos.Any())
   .AsQueryable();

var users = _context.Users.Include(p => p.Photos)
    .Where(p => p.HasPhoto == true) 
    .AsQueryable();

return相同的结果,实际return时间将是毫秒级的。

不过,考虑到结果集比较大,考虑.Any()LINQ扩展方法

public static bool Any<TSource> (this System.Collections.Generic.IEnumerable<TSource> source)

并且此方法不会 return 集合中的任何一个元素。相反,它确定集合是否包含任何元素(因此减少了总执行时间)。

因此,最终 Any() 扩展方法的性能会更好。