我有以下代码:
if (itemsListFromDbQuery != null && itemsListFromDbQuery.Any())
{
tempItemsList.Add(new ItemModel
{
FieldOne = itemsListFromDbQuery.FirstOrDefault().FieldOne,
FieldTwo = itemsListFromDbQuery.FirstOrDefault().FieldTwo ?? 0
});
}
感觉有些慢,所以我添加了持续时间日志,并发现每次执行此代码时平均需要800毫秒。
更新:以下是获取itemsListFromDbQuery
的代码:
var itemsListFromDbQuery = getListFromDbQuery();
public IEnumerable<Item> getListFromDbQuery()
{
return DbContext.Items.Where(...);
}
为什么这段代码执行得这么慢? 我该怎么做才能提高性能?
答案 0 :(得分:3)
因为itemsListFromDbQuery
看起来像IQueryable<T>
,所以会延迟执行。
所以:itemsListFromDbQuery.Any()
和itemsListFromDbQuery.FirstOrDefault()
(两次)将再次执行查询。
将实体保存在列表中,或事先致电FirstOrDefault()
:
var queryMaterialized = itemsListFromDbQuery.FirstOrDefault();
if (queryMaterialized != null)
{
tempItemsList.Add(new ItemModel
{
FieldOne = queryMaterialized.FieldOne,
FieldTwo = queryMaterialized.FieldTwo ?? 0
});
}
itemsListFromDbQuery
永远不会是null
。