This is a migrated thread and some comments may be shown as answers.

LINQ Join Group Object reference not set to an instance of an object <SelectManyIterator>

2 Answers 338 Views
LINQ (LINQ specific questions)
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Camilo
Top achievements
Rank 1
Camilo asked on 01 Nov 2013, 09:56 PM
Hi, I have the following problem in a Linq query with subquery and returns me a list group but materialize against a user-defined class, the resulting error message is as follows. Cual puede ser la mejor soluciĆ³n a este problema, si el objeto de materializacion permite datos null, que tipo de dato debo evaluar para que lo reciba, gracias por sus comentarios.

{System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
   en lambda_method(Closure , <>f__AnonymousType16`2 , <>f__AnonymousType15`7 )
   en System.Linq.Enumerable.<SelectManyIterator>d__31`3.MoveNext()
   en System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   en System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   en RFASTCUR.C39.LogicaAplicacion.M39SolicitudBLL.ObtenerList()

////// The Class Business /////////

namespace RFASTCUR.C39.LogicaAplicacion
{
    public partial class M39SolicitudBLL   
    {

        public List<M39SolicitudRtoDTO> ObtenerList()
        {

            List<M39SolicitudRtoDTO> listaM39SolicitudRtoDTO = null;
            try
            {

                listaM39SolicitudRtoDTO = (
                        from tablaSolicitud in this.bdContext.M39Solicituds
                        join tablaSolicitudEstadoRcion in
                            (
                                (from solEstadoRecepLlam in this.bdContext.M39SolicitudEstados
                                 join eSolicitudRecepLlam in this.bdContext.P39EstadoSolicituds
                                       on new { solEstadoRecepLlam.IdEstadoSolicitud, EstadoSolicitud = (11).ToString() }
                                   equals new { eSolicitudRecepLlam.IdEstadoSolicitud, eSolicitudRecepLlam.EstadoSolicitud }
                                 group solEstadoRecepLlam by new
                                 {
                                     solEstadoRecepLlam.IdSolicitud
                                 } into g
                                 select new
                                 {
                                     f2_IdSolicitud = g.Key.IdSolicitud,
                                     f2_FechaEstado = g.Min(p => p.FechaEstado)
                                 })) on new { IdSolicitud = tablaSolicitud.IdSolicitud }
                               equals new { IdSolicitud = tablaSolicitudEstadoRcion.f2_IdSolicitud }
                                   into tablaSolicitudEstadoRcion_join

                        from tablaSolicitudEstadoRcion in tablaSolicitudEstadoRcion_join.DefaultIfEmpty()
                        join tablaSolicitudEstadoUbic in
                            (
                                (from solEstadoUbicacion in this.bdContext.M39SolicitudEstados
                                 join eSolicitudUbicacion in this.bdContext.P39EstadoSolicituds
                                       on new { solEstadoUbicacion.IdEstadoSolicitud, EstadoSolicitud = (51).ToString() }
                                   equals new { eSolicitudUbicacion.IdEstadoSolicitud, eSolicitudUbicacion.EstadoSolicitud }
                                 group solEstadoUbicacion by new
                                 {
                                     solEstadoUbicacion.IdSolicitud,
                                     solEstadoUbicacion.FechaEstado
                                 } into f
                                 select new
                                 {
                                     f3_IdSolicitud = f.Key.IdSolicitud,
                                     f3_FechaEstado = (DateTime?)f.Key.FechaEstado
                                 })) on new { IdSolicitud = tablaSolicitud.IdSolicitud } equals new { IdSolicitud = tablaSolicitudEstadoUbic.f3_IdSolicitud } into tablaSolicitudEstadoUbic_join
                        from tablaSolicitudEstadoUbic in tablaSolicitudEstadoUbic_join.DefaultIfEmpty()
                        join tablaSolicitudConfirm in
                            (
                                (from solEstadoConfirm in this.bdContext.M39SolicitudEstados
                                 join eSolicitudConfirm in this.bdContext.P39EstadoSolicituds
                                       on new { solEstadoConfirm.IdEstadoSolicitud, EstadoSolicitud = (61).ToString() }
                                   equals new { eSolicitudConfirm.IdEstadoSolicitud, eSolicitudConfirm.EstadoSolicitud }
                                 group solEstadoConfirm by new
                                 {
                                     solEstadoConfirm.Idm39SolicitudEstado,
                                     solEstadoConfirm.IdSolicitud,
                                     solEstadoConfirm.CodigoUsuario,
                                     solEstadoConfirm.IdEstadoSolicitud,
                                     solEstadoConfirm.IdCausaEstadoSolicitud,
                                     solEstadoConfirm.Observaciones
                                 } into h
                                 select new
                                 {
                                     f4_Idm39SolicitudEstado = (int?)h.Key.Idm39SolicitudEstado,
                                     f4_IdSolicitud = h.Key.IdSolicitud,
                                     f4_CodigoUsuario = h.Key.CodigoUsuario,
                                     f4_FechaEstado = (DateTime?)h.Max(p => p.FechaEstado),
                                     f4_IdEstadoSolicitud = (int?)h.Key.IdEstadoSolicitud,
                                     f4_IdCausaEstadoSolicitud = h.Key.IdCausaEstadoSolicitud,
                                     f4_Observaciones = h.Key.Observaciones
                                 })) on new { IdSolicitud = tablaSolicitud.IdSolicitud } equals new { IdSolicitud = tablaSolicitudConfirm.f4_IdSolicitud } into tablaSolicitudConfirm_join
                        from tablaSolicitudConfirm in tablaSolicitudConfirm_join.DefaultIfEmpty()
                        select new M39SolicitudRtoDTO
                        {
                            IdSolicitud = tablaSolicitud.IdSolicitud,
                            IdTipoSolicitante = tablaSolicitud.IdTipoSolicitante,
                            //FechaRecepcion = tablaSolicitudEstadoRcion.f2_FechaEstado,
                            CodigoSolicitante = tablaSolicitud.CodigoSolicitante,
                            Historia = tablaSolicitud.Historia,
                            DireccionOrigen = tablaSolicitud.DireccionOrigen,
                            PrestadorOrigen = tablaSolicitud.PrestadorOrigen,
                            IdPersonaSolicitante = tablaSolicitud.IdPersonaSolicitante,
                            AutorizacionSolicitante = tablaSolicitud.AutorizacionSolicitante,
                            IdClasificacionTriage = tablaSolicitud.IdClasificacionTriage,
                            DepartamentoOrigen = tablaSolicitud.DepartamentoOrigen,
                            IdApertura = tablaSolicitud.IdApertura,
                            DireccionDestino = tablaSolicitud.DireccionDestino,
                            PrestadorDestino = tablaSolicitud.PrestadorDestino,
                            ComentariosUbicacion = tablaSolicitud.ComentariosUbicacion,
                            DepartamentoDestino = tablaSolicitud.DepartamentoDestino,
                            MunicipioDestino = tablaSolicitud.MunicipioDestino,
                            IdMovil = tablaSolicitud.IdMovil,
                            //FechaDespacho = tablaSolicitudEstadoUbic.f3_FechaEstado,
                            OrdenInternacion = tablaSolicitud.OrdenInternacion,
                            IpsInternacion = tablaSolicitud.IpsInternacion,
                            DocumentoInternacion = tablaSolicitud.DocumentoInternacion,
                            /*f4Idm39SolicitudEstado = tablaSolicitudConfirm.f4_Idm39SolicitudEstado, /// ERROR GENERATED
                            f4IdSolicitud = (int?)tablaSolicitudConfirm.f4_IdSolicitud, /// ERROR GENERATED
                            f4CodigoUsuario = tablaSolicitudConfirm.f4_CodigoUsuario, /// ERROR GENERATED
                            f4FechaConfirm = tablaSolicitudConfirm.f4_FechaEstado,
                            f4IdEstadoSolicitud = tablaSolicitudConfirm.f4_IdEstadoSolicitud,
                            f4IdCausaEstadoSolicitud = tablaSolicitudConfirm.f4_IdCausaEstadoSolicitud,*/
                            f4Observaciones = tablaSolicitudConfirm.f4_Observaciones   /// ERROR GENERATED
                        }).ToList();
         }
            catch (NullReferenceException ex) { 
               }
            return listaM39SolicitudRtoDTO;
           }
    }

////// defined class USER ////



namespace RFASTCUR.Datos.OpenAccess.RTO
{

    public class M39SolicitudRtoDTO : M39Solicitud
    {
        public DateTime? FechaRecepcion { get; set; }
        public DateTime? FechaDespacho { get; set; }
        public int f4Idm39SolicitudEstado? { get; set; }
        public int f4IdSolicitud? { get; set; }
        public string f4CodigoUsuario { get; set; }
        public DateTime f4FechaConfirm? { get; set; }
        public byte f4IdEstadoSolicitud { get; set; }
        public short? f4IdCausaEstadoSolicitud { get; set; }
        public String f4Observaciones { get; set; }
    }
}


M39Solicitud Class Open Access Model


2 Answers, 1 is accepted

Sort by
0
Accepted
Thomas
Telerik team
answered on 04 Nov 2013, 11:23 AM
Hi Camilo,

that is a complex query! Because OpenAccess is currently not capable to push the whole construct in one piece to the database server, some parts of the query will be executed in memory. Those parts need special attention as null value handling is different from the null handling in the database server.
In order to fix this query (and the NullReferenceException is in the client side in memory handling) you will need to protect all the accesses of query parts following a .DefaultIfEmpty() expression.
Which means for example tablaSolicitudEstadoRcion, tablaSolicitudEstadoUbic and tablaSolicitudConfirm accesses must be guarded with expressions like
x != null ? x.Y : null
instead of a simple x.Y. This kind of expression is needed when the client executes this statement; for server side code this is not needed all the time.
Please consider using a more explicit joining in the client approach, where you execute the 3 inner calculations on the server and outer join them then in the client more explicitly. This could help clarifying the intention of the entire expression.

Regards,
Thomas
Telerik
OpenAccess ORM Q3 2013 simplifies your model operations even further providing you with greater flexibility. Check out the list of new features shipped with our latest release!
0
Camilo
Top achievements
Rank 1
answered on 06 Nov 2013, 12:54 PM
thomas thanks for your prompt response, it worked for me x != null ? x.Y : null 




Tags
LINQ (LINQ specific questions)
Asked by
Camilo
Top achievements
Rank 1
Answers by
Thomas
Telerik team
Camilo
Top achievements
Rank 1
Share this question
or