LINQ (Max) avec des valeurs Null
J'ai une liste qui contient un tas de Points (avec un X et la composante Y).
Je veux obtenir le Max X pour tous les points dans la liste, comme ceci:
double max = pointList.Max(p=> p.X);
Le problème, c'est quand j'ai une valeur null dans la liste au lieu d'un point. Quelle serait la meilleure façon de contourner ce problème?
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous pourriez juste filtrent:
D'autre part, si vous voulez
null
s à être traitées comme si elles étaient les points ayant coordonnée X0
(ou similaire), vous pourriez faire:Ne remarque que les deux techniques vont se jeter, si la séquence est vide. Une solution de contournement pour ce (si souhaité) serait:
DefaultIfEmpty
. Merci de regarder ma réponse quant à pourquoi: lienpointList.Max(p => p == null ? (double?)null : p.X)
si il le voulait. Notez que les types nullablesMax
ne va rien faire, même pas avec une séquence vide.Si vous souhaitez fournir une valeur par défaut pour les X d'un point nul:
Ou pour fournir une valeur par défaut pour la liste vide:
DefaultIfEmpty
est appliqué sur le résultat type.Je ne recommanderais pas à l'aide de la
DefaultIfEmpty
dans ce cas, car il produit un assez grand SQL par rapport à d'autres alternatives.Veuillez jeter un oeil à cet exemple:
Nous avons une liste de modules pour une page et que vous souhaitez obtenir le maximum de valeur de la colonne "Type". Si la liste ne comporte aucun enregistrement, la valeur null est retournée.
DefaultIfEmpty
vérifie null et retourne la valeur par défaut du type de données de colonne lorsque la colonne est null.Ce produit le SQL suivant:
Si nous à la place de fonte de la colonne à une nullable et laissez
Convert.ToInt32()
gérer la valeur null comme:Alors nous obtenons le code SQL suivant:
Je peux vraiment recommander à l'aide de ExpressProfiler pour la vérification de la requête SQL est exécutée:
http://expressprofiler.codeplex.com/
La dernière expression Linq peut aussi être écrit comme:
et produira les mêmes SQL, mais j'aime le plus concis
.Max(t => (int?)t.Sort)
.Convert.ToInt32( (from x in table join y in table 2 on x.ID equals y.ID where y.ProjectID == ProjectID select x.ObservationNum).Max());
Est-il un moyen de faire le joint avec votre syntaxe, ou de modifier ma méthode pour arriver à la nullable int cast?Devrait fonctionner.
Place nullable coulé à l'INTÉRIEUR de l'expression afin de s'assurer qu'une liste vide sera jeté comme une valeur null. Vous pouvez ensuite ajouter des valeurs par défaut.
Essayer de casting pour nullable
plus:
Max ou par Défaut?
Pourquoi ne pas tout simplement:
Cela fonctionne avec de la mémoire de listes et Linq2Sql, et probablement de manière efficace aussi.
Nullable colonne avec max est comme suit
Ci-dessus énoncé de retour nombre maximal de propriété d'entité