Palmi
Palmi

Reputation: 2521

Performance issue with List operations

I have following code:

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

It felt somewhat slow so I added a duration log and saw that each time it executes this code it takes an average of 800 ms.

UPDATE: Here is the code to get the itemsListFromDbQuery:

var itemsListFromDbQuery = getListFromDbQuery();

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

Why does this code execute so slowly?
What can I do to improve the performance?

Upvotes: 0

Views: 43

Answers (1)

CodeCaster
CodeCaster

Reputation: 151710

Because itemsListFromDbQuery looks like an IQueryable<T>, which will be executed deferredly.

So: itemsListFromDbQuery.Any() and itemsListFromDbQuery.FirstOrDefault() (twice) will execute the query again.

Save the entities in a list, or call FirstOrDefault() on beforehand:

var queryMaterialized = itemsListFromDbQuery.FirstOrDefault();

if (queryMaterialized != null)
{
    tempItemsList.Add(new ItemModel
    {
        FieldOne = queryMaterialized.FieldOne,
        FieldTwo = queryMaterialized.FieldTwo ?? 0
    });
}

itemsListFromDbQuery will never be null anyway.

Upvotes: 3

Related Questions