Séquence contient plus d'un élément
Je vais avoir quelques problèmes avec attrapant une liste de type "RhsTruck" grâce à Linq et obtenir leur affichage.
RhsTruck juste a properites marque, Modèle, numéro de Série, etc...
RhsCustomer a des propriétés CustomerName, CustomerAddress, etc...
Je reçois le message d'erreur "Séquence contient plus d'un élément". Des idées? Suis-je en approchant de cette façon le mal?
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();
}
- Utiliser prendre<>, même avec SQL Haut de page() fonction d'agrégation,
.Take(1).SingleOrDefault();
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous utilisez
SingleOrDefault
. Cette méthode ne sera possible que lorsque les collections contient exactement 0 ou 1 élément. Je crois que vous êtes à la recherche pourFirstOrDefault
qui va réussir n'importe comment beaucoup d'éléments dans la collection.SingleOrDefault
est en fait plus approprié queFirstOrDefault
. Aussi, cela a effectivement soulevé un problème plus grave avec l'OP de la conception de base de données, car il montre qu'il est possible d'ajouter 2 clients avec le même ID!SingleOrDefault
de travail. Vrai peut possible d'avoir une meilleure conception de base de données ici, mais qui me semble plus approprié, comme un commentaire sur l'OP et pas un -1 sur une réponse.SingleOrDefault
est en train de lancer une exception, car il y a une incohérence entre ce que la méthode attend et ce qu'il est trouver des. Ainsi, bien que votre réponse s'arrête à l'exception, pour moi, il ne fait pas de résoudre le problème, il s'agit plus d'un "sortir de prison gratuitement" carte d'où le -1.SingleOrDefault
tombe alors dans le moment où vous vous attendez à une collecte d'avoir 0 ou 1 éléments et que vous voulez vérifier ce qui se passe à chaque fois...SingleOrDefault
.SingleOrDefault
méthode déclenche uneException
si il n'y a plus d'un élément dans la séquence.Apparemment, votre requête dans
GetCustomer
est de trouver plus d'un match. De sorte que vous aurez besoin pour perfectionner votre requête ou, plus vraisemblablement, la vérification de vos données à voir pourquoi vous obtenez plusieurs résultats pour un numéro de client donné.Pour info, vous pouvez également obtenir cette erreur si EF Migrations tente d'exécuter sans Db configuré, par exemple dans un Projet de Test.
Chassé ce pendant des heures, avant je pensais que c'était erroring sur une requête, mais, pas à cause de la requête, mais parce que c'était quand Migrations coups de pied pour essayer de créer la Db.
SingleOrDefault renvoie un SEUL élément ou la valeur null si aucun élément n'est trouvé. Si 2 éléments sont présents dans votre Énumération, alors il lève l'exception que vous voyez
FirstOrDefault renvoie le PREMIER élément qu'il trouve ou la valeur null si aucun élément n'est trouvé. donc si il y a 2 éléments qui correspondent à vos prédicat le second est ignoré
Comme @Mehmet est, en indiquant, si votre résultat est de retour de plus de 1 elerment alors vous devez regarder dans les données que je soupçonne que ce n'est pas par la conception que vous avez des clients qui partagent un customernumber.
Mais le point que je voulais vous donner un aperçu rapide.
pour plus d'expressions Linq ont un coup d'oeil à Système.Linq.Les Expressions