web-dev-qa-db-fra.com

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

Je ne parviens pas à récupérer une liste de types "RhsTruck" dans Linq et à les afficher. 

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

Je continue à avoir l'erreur "La séquence contient plus d'un élément". Des idées? Est-ce que je l'aborde 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();   
}
96
Calvin

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

233
JaredPar

SingleOrDefault méthode lève une Exception s'il y a plusieurs éléments dans la séquence. 

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

22
Mehmet Aras

Pour votre information, vous pouvez également obtenir cette erreur si EF Migrations tente de s'exécuter sans configuration de base de données, par exemple dans un projet test.

J'ai poursuivi pendant des heures avant de comprendre qu'il s'agissait d'une erreur sur une requête, mais pas à cause de la requête mais parce que c'était au moment où Migrations a démarré pour essayer de créer le Db.

1
Chris Moschini
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, il lève l'exception que vous voyez

FirstOrDefault renvoie l'élément FIRST trouvé ou null si aucun élément n'est trouvé. donc 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);
1
Muhammad Armaghan

Comme @Mehmet l'a fait remarquer, si votre résultat renvoie plus d'un problème, vous devez examiner vos données, car je soupçonne que ce n'est pas intentionnellement que des clients partagent un numéro personnalisé. 

Mais au point 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 plus d'expressions Linq, jetez un oeil à System.Linq.Expressions

0
Martin Sax