C# 使用Include()和Find()的实体框架上下文缓存

C# 使用Include()和Find()的实体框架上下文缓存,c#,entity-framework,C#,Entity Framework,我正在优化一些实体框架代码,在上下文缓存方面遇到了一些问题 var db = new transactionContext(); // lazy loading, proxy creation disabled. var transactionsOfSameCustomer = db.Transactions.Where(t => t.CustomerId == currentTransaction.CustomerId && t.MostExpensiveItemId

我正在优化一些实体框架代码,在上下文缓存方面遇到了一些问题

var db = new transactionContext(); // lazy loading, proxy creation disabled.

var transactionsOfSameCustomer = db.Transactions.Where(t => t.CustomerId == currentTransaction.CustomerId && t.MostExpensiveItemId != Guid.Empty).Include("Items");

foreach (var transactionOfSameCustomer in transactionsOfSameCustomer)
{
    // method 1: slow
    var mostExpensiveItem = db.Items.Find(transactionOfSameCustomer.MostExpensiveItemId);

    // method 2: fast
    var mostExpensiveItem = transactionOfSameCustomer.Items.Where(i => i.ItemId == transactionOfSameCustomer.MostExpensiveItemId).First();
}
当前代码(方法1)使用
db.Items.Find()
使用事务字段MostExpensiveItemId查找事务中最昂贵的项目。当我改为
transaction.Items.Where()
(方法2)时,查询速度大约快了40倍

我想既然
Find()
是在访问数据库之前查询上下文,那么它应该和在内存中的集合上使用
Where()
一样快(方法2)


我正在运行Entity Framework 6.0。

只是为了澄清一下。您是调用
ToList()
/
First
/还是在
Where()
之后执行查询的任何其他方法,因为未执行其他方式的查询BTW:Where与First组合使用时,如果Where不返回任何内容,将抛出错误。我通常用FirstOrDefault来代替。@Uril我实际上没有。是因为这个原因,所以查询没有在代码块的第3行执行吗?@Robert good advice。我使用First()而不是FirstOrDefault(),因为我不希望这些查询中有任何查询返回null。您可能这样做了,但以防万一:请确保数据库中的MostexPensionVeItemId列存在索引。如果到目前为止还没有,您将对性能的提高感到惊讶。