11
votes

Frame-entité - Correction correcte de vérifier les enregistrements simples avant de les utiliser

Pour obtenir une liste d'enregistrements, je fais normalement quelque chose dans le sens de: xxx

pour obtenir un seul disque, quand je sais que j'utilise le PK pour la récupérer, j'utilise quelque chose Comme: xxx

Maintenant, à l'aide de l'approche d'enregistrement unique, si la PK est une valeur défectueuse (comme elle est à condition de tester) la 2ème ligne jette une erreur.

Quelle est la la meilleure pratique d'obtenir un seul disque et de traiter avec elle?


0 commentaires

4 Réponses :


25
votes

Utiliser SIMOREFAULT si vous attendez 0 ou 1, ou sReveArdefault si vous avez juste besoin du premier enregistrement de potentiel, mais peut faire face à 0. Les deux renvoient les deux valeur par défaut pour le type (généralement NULL) s'il n'y a aucun résultat.

Au fait, des requêtes comme celle-ci sont généralement plus lisibles (imo) sans à l'aide d'une expression de requête, donc vous pourriez avoir quelque chose Comme: xxx

Les expressions de requête sont excellentes lorsque vous utilisez plusieurs opérateurs ou faire des choses relativement complexes telles que des jointures - mais si vous avez juste Vous avez un clause ou juste a eu une projection, cette "notation de points" est plus simple imo. Cela fonctionne également mieux lorsque vous devez appeler une méthode comme firstordfault à la fin.


7 commentaires

Merci pour le commentaire supplémentaire sur les expressions de requête. Encore beaucoup d'apprentissage sur EF et mon esprit n'enveloppe pas entièrement autour de la syntaxe Lambda. Me rappelle beaucoup d'anciens pointeurs de mémoire C. ;)


SingleFault est pris en charge dans EF 4, mais pas dans ef 1. FirstArdefault est pris en charge dans les deux.


@Jon Skeet - Quelle est la différence entre placer les mots de commande sur la chaîne LINQ ... ex. _db.mymodels.where (a => a.prop == "valeur"). Seuletfault (); contre _db.mymodels.singleordefault (). Où (A => A.Prop == "valeur"); - représentations? Ordre d'excence? etc...


@ one.beat.Consumer: la seconde ne compilera même pas (en général), car SmoorFault renvoie une valeur unique, pas une séquence. Mais si a fait compiler, cela ne ferait pas ce que vous vouliez. Il vérifierait qu'il n'y a qu'une seule valeur dans toute la table MyModels , puis appliquez le filtre à celui-ci.


@Jonskeet j'ai réalisé que juste après que je l'ai tapé. Comment diriez-vous: _db.models.select (modèle => Nouvelle viewModel {Prop = Model.Prop}). Tolist (). Où (ViewModel => ViewModel.Prop = "Valeur"); Versus _db.models.select (modèle => Nouvelle viewModel {Prop = Model.Prop}). Où (ViewModel => ViewModel.Prop = "Valeur"). Toliste (); - Quels sont les implications de ces différents? des différences de performance? activité de la base de données? problèmes de coulée? juste curieux


@ one.beat.Consumer: appeler tolist forcera tous les résultats à revenir au client, à quel point linq aux objets prendront le dessus ... vs exécution de la requête dans la base de données, qui est évidemment plus efficace.


Merçi pour la confirmation. À



8
votes

Notez que SingleFault () et sRevarArdefault () ne permettra pas Vous devez spécifier la valeur par défaut.

Il y a faitFempty () , Ce qui vous permet de spécifier la valeur par défaut que vous souhaitez renvoyer s'il n'y a pas d'éléments dans l'énumérable. Vous pouvez combiner celui-ci avec premier () (comme dans defaulfempty (). Premier () ) pour atteindre sReveReDefault () une Lambda pour envelopper la création d'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 tout () . Cependant, cela entraînera deux questions, si vous devez traiter le dossier s'il existe.


5 commentaires

Tout () est le meilleur moyen d'aller si vous avez juste besoin de vérifier l'existence.


DefaultIfrempty , comme SIMOREFAULT , est pris en charge dans EF 4 mais pas EF 1.


Je sais que cela a 8 ans maintenant, mais aucune chance d'un exemple?


@Cloud Désolé, je n'ai touché aucune technologie Microsoft au cours des sept dernières années environ, alors ...: - /


Si (votre DataTable.ca ()) {} de (votre DataTable.ca (x => x.field == true || x.therfield == "test") {} @cloud est cet exemple que vous vouliez?



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

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

0 commentaires

0
votes

Vous pouvez également utiliser

_dbRiv.Company.FirstOrDefault(x => x.Id == #id);


1 commentaires

Je suppose que s'il y a un indice, il n'aurait pas besoin de numériser toute la table.