none
Ayuda con ToList en LINQ to Sql RRS feed

  • Pregunta

  • ¡Buenas tardes amigos expertos!

    Tengo el siguiente código en c# y no logro corregir los errores que me da.  Soy nuevo usando LINQ y he buscado en internet ayuda al respecto, pero no he tenido suerte.

    Este es el código:

    var ClienteActual = (from regCliente in ClientesDC.Clientes
                                         where regCliente.IdFiscal == (String)ClientesDataGridView["ColumnIdFiscal", ClientesDataGridView.CurrentRow.Index].Value
                                         join regPais in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Pais equals regPais.CasaEdifQta.Pais
                                         join regEstado in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Estado equals regEstado.CasaEdifQta.Estado
                                         join regLocalidad in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Localidad equals regLocalidad.CasaEdifQta.Localidad
                                         join regSector in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Sector equals regSector.CasaEdifQta.Sector
                                         join regAutAvCll in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.AutAvCll equals regAutAvCll.CasaEdifQta.AutAvCll
                                         join regCasaEdifQta in ClientesDC.CasaEdifQta
                                         on regCliente.CasaEditQta equals regCasaEdifQta.CasaEdifQta1
                                         join regPisoNivel in ClientesDC.PisoNivel
                                         on regCliente.PisoNivel equals regPisoNivel.PisoNivel1
                                         join regAptoLocal in ClientesDC.AptoLocal
                                         on regCliente.AptoLocal equals regAptoLocal.AptoLocal1).ToList()(0);

    De antemano, muchísimas gracias por su gran ayuda! 

    domingo, 5 de febrero de 2012 17:19

Todas las respuestas

  • Y que error te da exactamente?

    Ya a primera vista te digo que ese .ToList()(0) dará error si o si la mayoria de veces en que no exista.

    Te recomiendo hacer .ToList().FirstOrDefault() y luego puedes comprobar si ClienteActual != null para realizar operaciones con el.


    Vota mi respuesta si te ha sido útil. Gracias.
    domingo, 5 de febrero de 2012 18:51
  • Ciertamente! Disulpen por no indicar los errores!

    En el último join indica el siguiente error: "El tipo de una de las expresiones de la cláusula join es incorrecto. No se pudo inferir el tipo en la llamada a 'Join'"

    Y el otro error aparece al cierre del paréntesis, antes del .ToList() y es el siguiente: "El cuerpo de una consulta debe terminar con una cláusula select o group"

    Imagino que el error del último join desaparecerá al corregir lo correspondiente al ToList.

    domingo, 5 de febrero de 2012 19:11
  • Quizas ambos errores deriven del mismo...

    El primero no lo entiendo asi que empecemos por descartar el segundo.

    La consulta LINQ no tiene un select, es decir lo que has escrito solamente indica las tablas con las que se trabajan, pero carece del select que indique que datos se devuelven a la variable.

    Pro ejemplo, si pones

    var ClienteActual = (from regCliente in ClientesDC.Clientes
                                         where regCliente.IdFiscal == (String)ClientesDataGridView["ColumnIdFiscal", ClientesDataGridView.CurrentRow.Index].Value
                                         join regPais in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Pais equals regPais.CasaEdifQta.Pais
                                         join regEstado in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Estado equals regEstado.CasaEdifQta.Estado
                                         join regLocalidad in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Localidad equals regLocalidad.CasaEdifQta.Localidad
                                         join regSector in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Sector equals regSector.CasaEdifQta.Sector
                                         join regAutAvCll in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.AutAvCll equals regAutAvCll.CasaEdifQta.AutAvCll
                                         join regCasaEdifQta in ClientesDC.CasaEdifQta
                                         on regCliente.CasaEditQta equals regCasaEdifQta.CasaEdifQta1
                                         join regPisoNivel in ClientesDC.PisoNivel
                                         on regCliente.PisoNivel equals regPisoNivel.PisoNivel1
                                         join regAptoLocal in ClientesDC.AptoLocal
                                         on regCliente.AptoLocal equals regAptoLocal.AptoLocal1
    select regCliente).ToList().FirstOrDefault();
    

    Devolveras el contenido de la tabla ClientesDC.Clientes si es lo que pretendes, sino puedes ir concatenando más datos al estilo "select new { regCliente, regPisoNivel }" reemplazando el "select regCliente" del ejemplo que te puse

     

    Haber si con esto se soluciona el otro error o cambia, ahora mismo no caigo en que puede ser.

     


    Vota mi respuesta si te ha sido útil. Gracias.
    domingo, 5 de febrero de 2012 19:51
  • Un par de cosillas. Si quieres recuperar sólo un cliente, sí que te servirá ese FirstOrDefault que te comenta David, aunque no hace falta añadir previamente el ToList().

    Ahora, una pregunta. ¿Todos esos joins los usas para poder leer datos de las... llamémosles tablas satélites?. Lo digo porque me parece ver que recuperas el pais, el estado, la localidad... que me imagino que los tendrás en la base como tablas relacionadas....

    ¿Conoces el uso de la clase DataLoadOptions?. Te permitirá tener el código mucho más limpio y menos supeditado e errores. Da la impresión que el error que te está dando en la relación join es un problema de tipos de propiedades diferentes...

    http://msdn.microsoft.com/es-es/library/system.data.linq.dataloadoptions.aspx

     

    domingo, 5 de febrero de 2012 20:13
  • Quizas ambos errores deriven del mismo...

    El primero no lo entiendo asi que empecemos por descartar el segundo.

    La consulta LINQ no tiene un select, es decir lo que has escrito solamente indica las tablas con las que se trabajan, pero carece del select que indique que datos se devuelven a la variable.

    Pro ejemplo, si pones

    var ClienteActual = (from regCliente in ClientesDC.Clientes
                                         where regCliente.IdFiscal == (String)ClientesDataGridView["ColumnIdFiscal", ClientesDataGridView.CurrentRow.Index].Value
                                         join regPais in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Pais equals regPais.CasaEdifQta.Pais
                                         join regEstado in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Estado equals regEstado.CasaEdifQta.Estado
                                         join regLocalidad in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Localidad equals regLocalidad.CasaEdifQta.Localidad
                                         join regSector in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.Sector equals regSector.CasaEdifQta.Sector
                                         join regAutAvCll in ClientesDC.Clientes
                                         on regCliente.CasaEdifQta.AutAvCll equals regAutAvCll.CasaEdifQta.AutAvCll
                                         join regCasaEdifQta in ClientesDC.CasaEdifQta
                                         on regCliente.CasaEditQta equals regCasaEdifQta.CasaEdifQta1
                                         join regPisoNivel in ClientesDC.PisoNivel
                                         on regCliente.PisoNivel equals regPisoNivel.PisoNivel1
                                         join regAptoLocal in ClientesDC.AptoLocal
                                         on regCliente.AptoLocal equals regAptoLocal.AptoLocal1
    select regCliente).ToList().FirstOrDefault();
    

    Devolveras el contenido de la tabla ClientesDC.Clientes si es lo que pretendes, sino puedes ir concatenando más datos al estilo "select new { regCliente, regPisoNivel }" reemplazando el "select regCliente" del ejemplo que te puse

     

    Haber si con esto se soluciona el otro error o cambia, ahora mismo no caigo en que puede ser.

     


    Vota mi respuesta si te ha sido útil. Gracias.


    Mi intención es la siguiente: para cada parte de la dirección del cliente he creado varias tablas (Pais, Estado, Localidad, Sector, etc) y en cada una de ellas he creado su clave primaria y un campo para la descripción.  Luego, en la tabla Clientes, uno de los campos que utilizo es CasaEdifQta, el cual pretendo utilizar para conseguir el resto de la dirección, ya que en la tabla CasaEdifQta, adicional a la clave primaria y el campo Descripción, también tengo los campos correspondientes al resto de la dirección, tales como el código del Pais, del Estado, la Localidad, etc.

    Lo que deseo hacer con este query es, poder accceder a la descripción de cada parte de la dirección, utilizando la información que de antemano ya está almacenada en la tabla CasaEdifQta, para así mostrarla en un TextBox o cualquier otro control.

    Esa es realmente mi intención.

    domingo, 5 de febrero de 2012 20:22
  • Un ejemplo rápido con DataLoadOptions:
    
    using (BaseDatosContext db = new BaseDatosContext())
    {
      DataLoadOptions lo = new DataLoadOptions();
      lo.LoadWith<Clientes>(p=>p.Pais);
      lo.LoadWith<Pais>(e=>e.Estado);
      ...
      db.DataLoadOptions = lo;
    
      string IdCliente = (String)ClientesDataGridView....
      var clienteActual = db.Clientes.Where(c=>c.IdCliente==IdCliente)
                         .SingleOrDefault();
    
    }
    

     

    Lo he hecho de memoria y piensa que no soy tan bueno como los maestros que tenemos por aquí, pero por ahí van los tiros y creo que la idea se puede sacar.

     

     

    domingo, 5 de febrero de 2012 20:31