215 votes

Valeur maximale de retour si la requête est vide

J'ai cette question :

int maxShoeSize = Workers
    .Where(x => x.CompanyId == 8)
    .Max(x => x.ShoeSize);

Ce qui sera dans maxShoeSize si l'entreprise 8 n'a pas de travailleurs du tout ?

UPDATE :
Comment puis-je modifier la requête afin d'obtenir 0 et non une exception ?

0 votes

Naor : avez-vous entendu parler de LINQPad ?

3 votes

Je ne comprends pas pourquoi vous demandez : "Qu'est-ce qui sera dans ? maxShoeSize ?" si vous l'aviez déjà essayé.

0 votes

@jwg : Je suppose que je voulais voir si vous connaissez la réponse :) Finalement, j'ai trouvé une meilleure façon de faire ce que j'ai demandé et c'est ce que je voulais dire.

5voto

Slauma Points 76561
int maxShoeSize=Workers.Where(x=>x.CompanyId==8)
    .Max(x=>(int?)x.ShoeSize).GetValueOrDefault();

(en supposant que ShoeSize est de type int )

Si Workers est un DbSet o ObjectSet à partir d'Entity Framework, votre requête initiale lèverait un InvalidOperationException mais ne se plaint pas d'une séquence vide, mais se plaint que la valeur matérialisée NULL ne peut pas être convertie en un numéro de série. int .

3voto

Johan Tidén Points 446

Max lancera System.InvalidOperationException "La séquence ne contient aucun élément".

class Program
{
    static void Main(string[] args)
    {
        List<MyClass> list = new List<MyClass>();

        list.Add(new MyClass() { Value = 2 });

        IEnumerable<MyClass> iterator = list.Where(x => x.Value == 3); // empty iterator.

        int max = iterator.Max(x => x.Value); // throws System.InvalidOperationException
    }
}

class MyClass
{
    public int Value;
}

3voto

Andrey St Points 101

NB : la requête avec DefaultIfEmpty() peuvent être significativement plus lent . Dans mon cas, il s'agissait d'une simple requête avec .DefaultIfEmpty(DateTime.Now.Date) .

J'étais trop paresseux pour le profiler, mais il est évident que EF a essayé d'obtenir toutes les lignes et ensuite de prendre le Max() valeur.

Conclusion : parfois la manipulation InvalidOperationException pourrait être le meilleur choix.

0voto

Jecoms Points 1122

Vous pouvez utiliser un ternaire dans .Max() pour gérer le prédicat et définir sa valeur ;

// assumes Workers != null && Workers.Count() > 0
int maxShoeSize = Workers.Max(x => (x.CompanyId == 8) ? x.ShoeSize : 0);

Vous devrez gérer le Workers étant nulle/vide si c'est une possibilité, mais cela dépend de votre implémentation.

0voto

Carlos Toledo Points 955

Vous pouvez essayer ceci :

int maxShoeSize = Workers.Where(x=>x.CompanyId == 8).Max(x => x.ShoeSize) ?? 0;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X