【发布时间】:2015-03-11 17:15:16
【问题描述】:
我有一个 LINQ 查询,它加载如下对象的层次结构。
查询 #1
var result = db.Orders
.Include("Customer")
// many other .Include() here
.FirstOrDefault(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId);
我遇到了严重的性能问题。
CPU 使用率接近 100%,内存使用率非常高。
然后我将其调整为以下,性能问题得到了修复。
查询 #2
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.FirstOrDefault();
我只是想证实我的怀疑。
查询 #1 可能正在遍历我的所有记录内存中寻找匹配记录
vs
查询 #2 过滤数据库中的记录,然后仅获取第一条记录。
这就是 Query #1 存在性能问题的原因吗?
为了安全起见,我需要在.FirstOrDefault() 之前使用.Select(x => x) 吗?
查询 #3
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.Select(x => x)
.FirstOrDefault();
【问题讨论】:
-
我同意你最初的想法。观察生成的查询并让您休息一下:-)
标签: entity-framework linq-to-entities