it-swarm.com.de

Sequenz enthält mehr als ein Element

Ich habe einige Probleme mit dem Aufrufen einer Liste des Typs "RhsTruck" durch Linq und deren Anzeige. 

RhsTruck hat nur die Eigenschaften Make, Model, Serial etc ... RhsCustomer hat die Eigenschaften CustomerName, CustomerAddress usw.

Ich erhalte ständig den Fehler "Sequenz enthält mehr als ein Element". Irgendwelche Ideen? Nähere ich mich dem falschen Weg?

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

Das Problem ist, dass Sie SingleOrDefault verwenden. Diese Methode wird nur erfolgreich sein, wenn die Sammlungen genau 0 oder 1 Element enthalten. Ich glaube, Sie suchen nach FirstOrDefault die erfolgreich sein wird, egal wie viele Elemente sich in der Sammlung befinden.

233
JaredPar

SingleOrDefault Die Methode gibt eine Exception aus, wenn die Sequenz mehr als ein Element enthält. 

Anscheinend findet Ihre Abfrage in GetCustomer mehr als eine Übereinstimmung. Sie müssen also entweder Ihre Abfrage verfeinern oder höchstwahrscheinlich Ihre Daten überprüfen, um herauszufinden, warum Sie für eine bestimmte Kundennummer mehrere Ergebnisse erhalten.

22
Mehmet Aras

Zu Ihrer Information können Sie diesen Fehler auch erhalten, wenn EF Migrations versucht, ohne konfigurierte Datenbank zu arbeiten, beispielsweise in einem Testprojekt.

Verfolgte dies stundenlang, bevor ich herausfand, dass bei einer Abfrage ein Fehler aufgetreten war, aber nicht aufgrund der Abfrage, sondern weil Migrationen die Db erstellt hatten.

1
Chris Moschini
Use FirstOrDefault insted of SingleOrDefault..

SingleOrDefault gibt ein SINGLE-Element oder null zurück, wenn kein Element gefunden wird. Wenn sich in Ihrem Enumerable 2 Elemente befinden, wird die Ausnahme ausgelöst, die Sie sehen

FirstOrDefault gibt das gefundene FIRST-Element zurück oder null, wenn kein Element gefunden wird. Wenn also zwei Elemente mit Ihrem Prädikat übereinstimmen, wird das zweite Element ignoriert

   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

Wie @Mehmet darauf hinweist, wenn Ihr Ergebnis mehr als 1 Element zurückgibt, müssen Sie Ihre Daten prüfen, da ich vermute, dass es nicht beabsichtigt ist, dass Kunden eine benutzerdefinierte Nummer haben. 

Aber zu dem Punkt wollte ich Ihnen einen schnellen Überblick geben.

//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();

weitere Linq-Ausdrücke finden Sie unter System.Linq.Expressions

0
Martin Sax