2009-08-10 40 views
88

Tengo algunos problemas para obtener una lista de tipo "RhsTruck" a través de Linq y hacer que se muestren.La secuencia contiene más de un elemento

RhsTruck acaba de properites marca, modelo, número de serie, etc ... RhsCustomer tiene propiedades CustomerName, CustomerAddress, etc ...

sigo obteniendo el error "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(); 
} 
+1

Utilice ** tomar <> **, lo mismo con SQL ** Función de agregado() ** superior, '.Take (1) .SingleOrDefault();' – Megamind

Respuesta

222

El problema es que está utilizando 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.

+0

Gracias, esto parece haber hecho el truco –

+7

Calvin, en ese caso, debe aceptar esta respuesta como una solución –

+21

-1 * "El problema es que está usando SingleOrDefault" * - por lo que puedo deducir, el OP está buscando una identificación de cliente que (supongo) debe ser única, por lo tanto, 'SingleOrDefault' es realmente más apropiado que' FirstOrDefault'. Además, esto ha planteado un problema más serio con el diseño de la base de datos del OP ya que muestra que es posible agregar 2 clientes con la misma ID. – James

20

SingleOrDefault método arroja un 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.

0

Como @Mehmet está señalando, si su resultado es la devolución de más de 1 elerment, entonces debe examinar sus datos ya que sospecho que no es por diseño que tiene clientes que comparten 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 LINQ echar un vistazo a System.Linq.Expressions

0

su información también se puede obtener este error si EF Migraciones trata de correr sin Db configurado, por ejemplo, en un proyecto de la 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 se iniciaron para tratar de crear el Db.

Cuestiones relacionadas