2017-08-07 71 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