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