visual studio secuencia mas elementos elemento contiene coincidente c# .net asp.net linq

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