c# - studio - La secuencia contiene más de un elemento
la secuencia no contiene elementos visual studio (5)
Tengo algunos problemas para obtener una lista de tipo "RhsTruck" a través de Linq y lograr que se muestren.
RhsTruck solo tiene propiedades, modelos, series, etc ... RhsCustomer tiene propiedades CustomerName, CustomerAddress, etc ...
Sigo recibiendo el error "La secuencia contiene más de un elemento". ¿Algunas ideas? ¿Me estoy acercando a esto de la manera incorrecta?
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();
}
Como señala @Mehmet, si el resultado arroja más de 1 elerment, entonces debe analizar sus datos, ya que sospecho que, por diseño, no tiene clientes que compartan un número de cliente.
Pero al punto que quería darle una visión general rápida.
//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();
para más expresiones de Linq, eche un vistazo a System.Linq.Expressions
El problema es que estás usando SingleOrDefault
. Este método solo tendrá éxito cuando las colecciones contengan exactamente 0 o 1 elemento. Creo que está buscando FirstOrDefault
que tendrá éxito sin importar cuántos elementos haya en la colección.
FYI también puede obtener este error si EF Migrations intenta ejecutarse sin Db configurado, por ejemplo, en un Proyecto de prueba.
Perseguí esto durante horas antes de darme cuenta de que se trataba de un error en una consulta, pero no debido a la consulta, sino porque fue cuando las Migraciones iniciaron para tratar de crear el Db.
SingleOrDefault
método SingleOrDefault
arroja una Exception
si hay más de un elemento en la secuencia.
Aparentemente, su consulta en GetCustomer
encuentra más de una coincidencia. Por lo tanto, deberá refinar su consulta o, lo más probable, verificar sus datos para ver por qué obtiene resultados múltiples para un número de cliente determinado.
Use FirstOrDefault insted of SingleOrDefault..
SingleOrDefault devuelve un elemento SINGLE o nulo si no se encuentra ningún elemento. Si se encuentran 2 elementos en su Enumerable, arroja la excepción que está viendo
FirstOrDefault devuelve el PRIMER elemento que encuentra o nulo si no se encuentra ningún elemento. entonces si hay 2 elementos que coinciden con tu predicado, el segundo es ignorado
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);