Entity Framework - Méthode correcte pour vérifier des enregistrements individuels avant de les utiliser

.net c# entity-framework

Question

Pour obtenir une LISTE de disques, je fais normalement quelque chose comme:

var efCompany = from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a;

Pour obtenir un seul enregistrement, lorsque je sais que j'utilise le PK pour le récupérer, j'utilise quelque chose comme:

var efCompany = (from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a).First();

Maintenant, en utilisant l’approche d’enregistrement unique, si la PC est une valeur erronée (comme elle le fait délibérément lors des tests), la deuxième ligne génère une erreur.

Quelle est la meilleure méthode pour obtenir un seul enregistrement et le gérer?

Réponse acceptée

Utilisez SingleOrDefault si vous attendez 0 ou 1, ou FirstOrDefault si vous avez simplement besoin du premier enregistrement sur plusieurs, mais pouvez gérer 0. Les deux FirstOrDefault la valeur par défaut du type (généralement null) s'il n'y a pas de résultats.

En passant, les requêtes de ce type sont généralement plus lisibles (IMO) sans utiliser d’expression de requête. Vous pouvez donc obtenir quelque chose comme:

var efCompany = _dbRiv.Company
                      .Where(a => a.CompanyId == companyFeedInfo.CompanyId)
                      .SingleOrDefault();

if (efCompany != null)
{
    // Use it
}
else
{
    // Report to user, or whatever
}

Les expressions de requête sont grands quand vous utilisez plusieurs opérateurs, ou faire des choses relativement complexes comme les jointures - mais si vous avez juste un where l' article ou juste eu une projection, cette « notation dot » est plus simple de l' OMI. Cela fonctionne aussi mieux lorsque vous devez appeler une méthode comme FirstOrDefault à la fin.


Réponse populaire

Notez que SingleOrDefault() et FirstOrDefault() ne vous permettront pas de spécifier la valeur par défaut.

Il existe DefaultIfEmpty() , qui vous permet de spécifier la valeur par défaut à renvoyer s'il n'y a aucun élément dans l'énumérable. Vous pouvez combiner celui-ci avec First() (comme dans DefaultIfEmpty().First() ) pour obtenir FirstOrDefault() comportement semblable à FirstOrDefault() et un lambda pour créer une nouvelle instance et l'ajouter à l'ensemble.

Si vous avez juste besoin de vérifier l'existence d'un enregistrement, vous pouvez également utiliser Any() . Toutefois, cela entraînera deux requêtes si vous devez traiter l'enregistrement s'il existe.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow