2017-07-28 3 views
1

La partie suivante du code est d'une requête LINQ plus grande, mais il est celui que je besoin d'aide avec:Comment traiter dans nulls LINQ to SQL avec Regex.Replace sur la propriété

KnowledgeTypeText = Regex.Replace((from categoryVersion in _Context.ArticleCategoryVersions 
            join category in _Context.Categories 
            on categoryVersion.CategoryID equals category.CategoryID 
            where category.ParentID.HasValue == true 
            && category.ParentID.Value == rootKnowledgeTypeID 
            && categoryVersion.Version == articleLatestVersions.Version 
            && categoryVersion.ArticleID == articleLatestVersions.ArticleID 
            select category).First().Name, @"(\d+[\\.]?\s*)", ""), 

La version courte : Cette partie de la requête va chercher une catégorie pour un article, mais il ne doit pas nécessairement avoir une valeur. Si elle a une valeur, je dois enlever la numérotation au début du texte.

Je reçois des exceptions lorsque la catégorie est NULL car elle essaie évidemment de faire l'action Remplacer sur la propriété Nom.

Comment ajouter du code pour gérer les Nulls? Il serait prudent de retourner une chaîne vide, mais je ne suis pas sûr de savoir comment le tester et retourner une chaîne vide.

+0

Avez-vous vraiment besoin de l'intégrer? Pourquoi ne pas simplement extraire select, faire 'FirstOrDefault' dessus, puis remplacer si la valeur n'est pas nulle? – icebat

+0

Est-ce que 'category' est nul? ou est-ce que c'est la propriété 'Name'' null'? Ou n'y a-t-il aucun élément dans la séquence? –

+0

Copie possible de [sélection d'une propriété de FirstOrDefault dans le cas où FirstOrDefault renvoie null] (https://stackoverflow.com/questions/19947464/selecting-a-property-from-firstordefault-in-case-firstordefault-returns-null) – Stefan

Répondre

2
  • Si vous ne parvenez pas à First() parce Sequence contains no elements remplacer ensuite avec .FirstOrDefault().
  • Si vous obtenez une valeur, mais il est null et il tombe en panne sur une référence null lors de l'accès Name puis utilisez .FirstOrDefault()?.Name
  • Si elle est la propriété Name qui est null puis utilisez le ??:

    (/* query */).FirstOrDefault()?.Name ?? string.Empty 
    

en savoir plus sur:


En outre, il est moins lisible mettre tout en ligne comme celui-ci (encore plus comme il semble être dans un initialiseur d'objet). D'abord avoir la requête, puis faire le remplacement:

var result = (from categoryVersion in _Context.ArticleCategoryVersions 
       join category in _Context.Categories 
       on categoryVersion.CategoryID equals category.CategoryID 
       where category.ParentID.HasValue && 
       category.ParentID.Value == rootKnowledgeTypeID && 
       categoryVersion.Version == articleLatestVersions.Version && 
       categoryVersion.ArticleID == articleLatestVersions.ArticleID && 
       select category).FirstOrDefault()?.Name ?? string.Empty; 

KnowledgeTypeText = Regex.Replace(result, @"(\d+[\\.]?\s*)", ""); 
+0

@Graham - pas de problème avec les modifications mais maintenant la première section de la réponse manque des informations importantes. Dommage de simplement supprimer les liens ... –

+0

Je n'ai pas vu d'autre explication autour de lui et supposé que c'était des informations complémentaires, non essentielles. Pendant que nous travaillons, nous savons que l'auteur original sera averti afin que vous puissiez revenir et vous améliorer comme bon vous semble. – Graham

+0

J'ai tendance à être d'accord avec @GiladGreen sur celui-ci, l'édition était inutile et le lien supprimé était en fait critique en termes de source pour la réponse. – Jacques