Tengo algunos problemas para obtener una lista del tipo "RhsTruck" a través de Linq y hacer que se muestren.
RhsTruck solo tiene las propiedades Marca, Modelo, Serie, 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();
}
.Take(1).SingleOrDefault();
Respuestas:
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á buscandoFirstOrDefault
cuál tendrá éxito sin importar cuántos elementos haya en la colección.fuente
SingleOrDefault
realidad es más apropiada queFirstOrDefault
. 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.SingleOrDefault
que funcione. Es cierto que puede ser posible tener un mejor diseño de base de datos aquí, pero parece más apropiado como un comentario sobre el OP y no como un -1 en una respuesta.SingleOrDefault
está lanzando una excepción porque hay una inconsistencia entre lo que espera el método y lo que encuentra. Entonces, aunque su respuesta detiene la excepción, para mí, en realidad no resuelve el problema, es más una tarjeta de "salir de la cárcel gratis", de ahí el -1.SingleOrDefault
entonces cae en cuando esperas que una colección tenga 0 o 1 elementos y quieres verificar que esto suceda cada vez ...SingleOrDefault
El método arroja unException
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 múltiples resultados para un número de cliente determinado.fuente
SingleOrDefault devuelve un elemento ÚNICO 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 su predicado, el segundo se ignora
fuente
Para su información, también puede obtener este error si EF Migrations intenta ejecutarse sin Db configurado, por ejemplo, en un proyecto de prueba.
Lo perseguí durante horas antes de darme cuenta de que se estaba cometiendo un error en una consulta, pero no por la consulta, sino porque fue cuando se activó Migraciones para intentar crear el archivo Db.
fuente
Como señala @Mehmet, si su resultado devuelve más de 1 elemento, entonces debe examinar sus datos, ya que sospecho que no es por diseño que tenga clientes que compartan un número de cliente.
Pero hasta el punto que quería darles una descripción general rápida.
para más expresiones Linq, eche un vistazo a System.Linq.Expressions
fuente