130 votes

La séquence contient plus d'un élément

J'ai quelques difficultés à récupérer une liste de type "RhsTruck" par Linq et à l'afficher.

RhsTruck a juste les propriétés Make, Model, Serial etc... RhsCustomer a les propriétés CustomerName, CustomerAddress, etc...

Je continue à obtenir l'erreur "Sequence contains more than one element" (de type InvalidOperationException ). Avez-vous des idées ? Est-ce que je m'y prends de la mauvaise façon ?

public RhsCustomer GetCustomer(string customerNumber)
{
    using (RhsEbsDataContext context = new RhsEbsDataContext() )
    {
        RhsCustomer rc = (from x in context.custmasts
                          where x.kcustnum == customerNumber
                          select new RhsCustomer()
                        {
                            CustomerName = x.custname,
                            CustomerAddress = x.custadd + ", " + x.custcity
                            CustomerPhone = x.custphone,
                            CustomerFax = x.custfax
                        }).SingleOrDefault();
        return rc;
    }
}

public List<RhsTruck> GetEquipmentOwned(RhsCustomer cust)
{
    using (RhsEbsDataContext context = new RhsEbsDataContext())
    {
        var trucks = (from m in context.mkpops
                      join c in context.custmasts
                        on m.kcustnum equals c.kcustnum
                      where m.kcustnum == cust.CustomerNumber
                      select new RhsTruck
                    {
                        Make = m.kmfg,
                        Model = m.kmodel,
                        Serial = m.kserialnum,
                        EquipID = m.kserialno1,
                        IsRental = false
                    }).ToList();
        return trucks;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    string testCustNum = Page.Request.QueryString["custnum"].ToString();

    RhsCustomerRepository rcrep = new RhsCustomerRepository();
    RhsCustomer rc = rcrep.GetCustomer(testCustNum);
    List<RhsTruck> trucks = rcrep.GetEquipmentOwned(rc);

    // I want to display the List into a Gridview w/auto-generated columns
    GridViewTrucks.DataSource = trucks;
    GridViewTrucks.DataBind();   
}

283voto

JaredPar Points 333733

Le problème est que vous utilisez SingleOrDefault . Cette méthode n'aboutira que si les collections contiennent exactement 0 ou 1 élément. Je crois que vous cherchez FirstOrDefault qui réussira quel que soit le nombre d'éléments dans la collection.

26voto

Mehmet Aras Points 3901

SingleOrDefault lance un Exception s'il y a plus d'un élément dans la séquence.

Apparemment, votre requête dans GetCustomer trouve plus d'une correspondance. Vous devrez donc soit affiner votre requête, soit, plus probablement, vérifier vos données pour savoir pourquoi vous obtenez plusieurs résultats pour un numéro de client donné.

10voto

Muhammad Armaghan Points 249
Use FirstOrDefault insted of SingleOrDefault..

SingleOrDefault renvoie un élément SINGLE ou null si aucun élément n'est trouvé. Si 2 éléments sont trouvés dans votre Enumerable, l'exception que vous voyez est levée.

FirstOrDefault renvoie le PREMIER élément trouvé ou null si aucun élément n'est trouvé. Ainsi, s'il y a 2 éléments qui correspondent à votre prédicat, le second est ignoré.

   public int GetPackage(int id,int emp)
           {
             int getpackages=Convert.ToInt32(EmployerSubscriptionPackage.GetAllData().Where(x
   => x.SubscriptionPackageID ==`enter code here` id && x.EmployerID==emp ).FirstOrDefault().ID);
               return getpackages;
           }

 1. var EmployerId = Convert.ToInt32(Session["EmployerId"]);
               var getpackage = GetPackage(employerSubscription.ID, EmployerId);

3voto

Chris Moschini Points 7278

Pour info, vous pouvez également obtenir cette erreur si EF Migrations tente de s'exécuter sans que la base de données soit configurée, par exemple dans un projet de test.

J'ai poursuivi ce problème pendant des heures avant de comprendre qu'il y avait une erreur sur une requête, mais pas à cause de la requête, mais parce que c'était au moment où Migrations est intervenu pour essayer de créer la base de données.

0voto

Martin Sax Points 313

Comme le souligne @Mehmet, si votre résultat renvoie plus d'un numéro, vous devez examiner vos données car je soupçonne que ce n'est pas à dessein que vous avez des clients qui partagent un numéro personnalisé.

Mais pour en venir au fait, je voulais vous donner un aperçu rapide.

//success on 0 or 1 in the list, returns dafault() of whats in the list if 0
list.SingleOrDefault();
//success on 1 and only 1 in the list
list.Single();

//success on 0-n, returns first element in the list or default() if 0 
list.FirstOrDefault();
//success 1-n, returns the first element in the list
list.First();

//success on 0-n, returns first element in the list or default() if 0 
list.LastOrDefault();
//success 1-n, returns the last element in the list
list.Last();

Pour d'autres expressions Linq, consultez le site Expressions System.Linq

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