我正在努力优化一些实体框架代码,并遇到了一些上下文缓存问题。
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()
使用Transaction,MostExpensiveItemId字段查找事务中最昂贵的项目。当我更改为transaction.Items.Where()
(方法2)时,查询速度提高了约40倍。
我认为,因为Find()
在访问数据库之前查询了上下文,它应该与在内存中的集合上使用Where()
一样快(方法2)?
我正在运行Entity Framework 6.0。