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列存在索引。如果到目前为止还没有,您将对性能的提高感到惊讶。