DbSet.Find method ridiculously slow compared to .SingleOrDefault on ID

前端 未结 1 406
野趣味
野趣味 2020-11-30 01:35

I have the following code (Database is SQL Server Compact 4.0):

Dim competitor=context.Competitors.Find(id)

When I profile this the Find me

相关标签:
1条回答
  • 2020-11-30 01:43

    Find calls DetectChanges internally, SingleOrDefault (or generally any query) doesn't. DetectChanges is an expensive operation, so that's the reason why Find is slower (but it might become faster if the entity is already loaded into the context because Find would not run a query but just return the loaded entity).

    If you want to use Find for a lot of entities - in a loop for example - you can disable automatic change detection like so (can't write it in VB, so a C# example):

    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;
        foreach (var id in someIdCollection)
        {
            var competitor = context.Competitors.Find(id);
            // ...
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
    

    Now, Find won't call DetectChanges with every call and it should be as fast as SingleOrDefault (and faster if the entity is already attached to the context).

    Automatic change detection is a complex and somewhat mysterious subject. A great detailed discussion can be found in this four-part series:

    (Link to part 1, the links to parts 2, 3 and 4 are at the beginning of that article)

    http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/

    0 讨论(0)
提交回复
热议问题