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();
}
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.
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.
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.
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);
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