web-dev-qa-db-fra.com

FirstOrDefaultAsync () & SingleOrDefaultAsync () vs FindAsync () EFCore

Nous avons 3 approches différentes pour obtenir des éléments uniques de EFCore, ils sont FirstOrDefaultAsync(), SingleOrDefaultAsync() (y compris ses versions sans valeur par défaut retournée, nous avons également FindAsync() et peut-être plus avec le même but comme LastOrDefaultAsync().

     var findItem = await dbContext.TodoItems
       .FindAsync(request.Id)
       .ConfigureAwait(false);

     var firstItem = await dbContext.TodoItems
        .FirstOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);

     var singleItem = await dbContext.TodoItems
        .SingleOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);

Je voudrais connaître les différences entre chacun d'eux. Jusqu'à présent, ce que je sais, c'est que nous FirstOrDefaultAsync() pour obtenir la première donnée une condition, (généralement en utilisant cela parce que nous savons que plus d'un élément peut satisfaire la condition), d'autre part, nous utilisons SingleOrDefaultAsync() car nous savons qu'il n'y a qu'une seule correspondance possible à trouver, et FindAsync() pour obtenir un élément étant donné sa clé primaire.

Je pense que FirstOrDefaultAsync() & SingleOrDefaultAsync() frappent toujours la base de données (pas sûr à ce sujet), et FindAsync() c'est ce que Microsoft Docs dit:

Recherche de manière asynchrone une entité avec les valeurs de clé primaire données. Si une entité avec les valeurs de clé primaire données existe dans le contexte, elle est renvoyée immédiatement sans faire de demande au magasin. Sinon, une demande est faite au magasin pour une entité avec les valeurs de clé primaire données et cette entité, si elle est trouvée, est attachée au contexte et retournée. Si aucune entité n'est trouvée dans le contexte ou le magasin, alors null est retourné.

Donc ma question est, si notre condition donnée utilisée pour FirstOrDefault(), SingleOrDefault() et FindAsync() est la clé primaire, avons-nous une différence réelle?

Ce que je pense, c'est que la première fois qu'ils sont utilisés, appuyez toujours sur la base de données, mais qu'en est-il des prochains appels?. Et probablement EFCore pourrait utiliser le même contexte pour obtenir les valeurs de FirstOrDefault() et SingleOrDefault() comme pour FindAsync(), peut-être?.

9
Diego Osornio

FindAsync

Dans une grande partie du code échafaudé, FindAsync peut être utilisé à la place de FirstOrDefaultAsync.

SingleOrDefaultAsync

récupère plus de données et fait un travail inutile. lève une exception s'il existe plusieurs entités qui correspondent à la partie filtre.

FirstOrDefaultAsync

ne lance pas s'il y a plus d'une entité qui correspond à la partie filtre.

https://docs.Microsoft.com/en-us/aspnet/core/data/ef-rp/crud?view=aspnetcore-2.2#singleordefaultasync-vs-firstordefaultasync

6
Joey Phillips