web-dev-qa-db-fra.com

La séquence contient plus d’un élément - SingleOrDefault n’aide pas

J'ai la ligne ci-dessous mais j'obtiens toujours une exception " La séquence contient plusieurs éléments "

Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);

J'espérais que SingleOrDefault éviterait l'exception.

15
StackTrace

SingleOrDefault renvoie un élémentSINGLEou null si aucun élément n'est trouvé. Si 2 éléments sont trouvés dans votre Enumerable, il lève l'exception que vous voyez. Tout comme Highlander ... avec Single - il ne peut y en avoir qu'un.

FirstOrDefault renvoie l'élémentFIRSTqu'il trouve ou null si aucun élément n'est trouvé. Donc, si 2 éléments correspondent à votre prédicat, le second est ignoré.

En supposant que vous ne vous souciez pas de la présence de plusieurs correspondances et que vous ne voulez que la première ou nulle si aucune correspondance n'est trouvée ... alors vous voulez probablement ce qui suit ...

Details rd = this.db.Details
    .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);

Notez que ces deux méthodes ne renvoient qu'un élément, elles ne diffèrent que par ce qu'elles font après avoir trouvé une correspondance. First cesse de regarder ce point et retourne ce qu'il a trouvé, Single vérifie le reste de la liste pour s'assurer qu'il n'y a plus de correspondance. La partie OrDefault détermine ce qu’elle renvoie si aucune correspondance n’est trouvée. SingleOrDefault ou FirstOrDefault renvoie null si aucune valeur n'est trouvée, mais si vous utilisez simplement Single ou First, il DOIT alors trouver une correspondance, sinon une exception sera levée.

EDIT: Bon point Steve Étant donné que First renvoie le premier élément, vous devrez peut-être utiliser une OrderBy pour vous assurer que l’élément souhaité est bien le premier. Par exemple ... supposons que votre objet ait une propriété UpdateDate et que vous souhaitiez qu'il contienne la plus récente UpdateDate ...

Details rd = this.db.Details
    .OrderByDescending(x => x.UpdateDate)
    .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
31
Kevin

Si vous rencontrez une liste, convertissez-la en liste IEnumerable, utilisez la méthode FirstOrDefault.

 IEnumerable<BuyOnlineSearchdetails> details = new List<BuyOnlineSearchdetails>();

var FirstRow = details.FirstOrDefault();
            string Count = "0";
            if (FirstRow != null)
            {
                Count = FirstRow.TotalCount.ToString();
            }
            else
            {
                Count = "0";
            }
0
Arun Prasad E S