2017-08-07 48 views
0

我有以下代码:性能问题与列表操作

if (itemsListFromDbQuery != null && itemsListFromDbQuery.Any()) 
{ 
    tempItemsList.Add(new ItemModel 
    { 
     FieldOne = itemsListFromDbQuery.FirstOrDefault().FieldOne, 
     FieldTwo = itemsListFromDbQuery.FirstOrDefault().FieldTwo ?? 0 
    }); 
} 

这感觉有点慢,所以我增加了一个持续时间日志,发现每一次执行这个代码需要800毫秒的平均水平。

UPDATE:这里是代码来获取itemsListFromDbQuery

var itemsListFromDbQuery = getListFromDbQuery(); 

public IEnumerable<Item> getListFromDbQuery() 
{ 
    return DbContext.Items.Where(...); 
} 

为什么这段代码执行这么慢?
我该怎么做才能提高性能?

+1

那么你可能会在这里运行3个查询(至少)。 – DavidG

+1

对于性能问题,总是使用诸如DotTrace的分析器。它显示了你的确切位置 - 如果甚至 - 你会失去时间。 – HimBromBeere

回答

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反正。

+0

我以为我已经将查询结果保存在IEnumerable中。我如何确保它确实将它保存在列表中,并且不再执行查询? – Palmi

+1

@Palmi取决于“保存在IEnumerable中”是什么意思? – DavidG

+2

@Palmi你可能想阅读[问]并意识到我们看不到你的其他代码。我觉得我的假设足够安全,可以写出答案,但如果没有在问题中显示更多代码,我不能(也不会)回答任何后续问题。 – CodeCaster