none
Problemas en consulta linq WHERE RRS feed

  • Pregunta

  • Hola

    Trabajo en una app Windows Forms, SQL Server 2014 Express Edition y EF Code First

    Tengo la siguiente query Linq

    var result = from po in context.ProductoOrdenes
                                 join p in context.Productos on po.ProductoId equals p.ProductoId
                                 join pre in context.Presentaciones on po.PresentacionId equals pre.PresentacionId
                                 join a in context.Almacenes on po.AlmacenId equals a.AlmacenId
                                 join oi in context.OrdenInventarios on po.OrdenInventarioId equals oi.OrdenInventarioId
                                 where
                                 oi.EstadoOrden == EstadoOrden.Aprobado
                                 &&
                                 (filter.HasNumberOrder && oi.NumeroOrden.Contains(filter.NumeroOrden))
                                 ||
                                 (filter.HasFechaEmisionDesde && DbFunctions.TruncateTime(oi.Fecha) >= filter.FechaEmisionDesde)
                                 &&
                                 (filter.HasFechaEmisionHasta && DbFunctions.TruncateTime(oi.Fecha) <= filter.FechaEmisionHasta)
                                 select
                                 new ProductoOrdenInventarioExtend()
                                 {
                                     Id = po.ProductoOrdenId,
                                     NumeroOrden = oi.NumeroOrden,
                                     NombreProducto = p.Nombre,
                                     PresentacionId = po.PresentacionId,
                                     NombrePresentacion = pre.Nombre,
                                     AlmacenId = po.AlmacenId,
                                     NombreAlmacen = a.Nombre,
                                     Cantidad = po.Cantidad,
                                     TipoOperacion = po.TipoOperacion
                                 };
                    return result.ToList();

    La he probado por partes primero con el filtro de Numero de Orden y funciona bien luego lo he comentado y he probado solo con el filtro de fechas y funciona muy bien pero cuando envio toda la consulta me trae datos inconsistentes como lo siguiente:

    En la consulta estoy llamando a todos los registros del detalle que en la cabecera estén aprobados = 2 pero me esta trayendo 1 Emitidos y 2 Aprobados, ¿El problema es cuando envío toda la query junta?

    SQL

    exec sp_executesql N'SELECT 
        [Extent1].[ProductoOrdenId] AS [ProductoOrdenId], 
        [Extent5].[NumeroOrden] AS [NumeroOrden], 
        [Extent2].[Nombre] AS [Nombre], 
        [Extent1].[PresentacionId] AS [PresentacionId], 
        [Extent3].[Nombre] AS [Nombre1], 
        [Extent1].[AlmacenId] AS [AlmacenId], 
        [Extent4].[Nombre] AS [Nombre2], 
        [Extent1].[Cantidad] AS [Cantidad], 
        [Extent1].[TipoOperacion] AS [TipoOperacion]
        FROM     [dbo].[ProductoOrdenes] AS [Extent1]
        INNER JOIN [dbo].[Productos] AS [Extent2] ON [Extent1].[ProductoId] = [Extent2].[ProductoId]
        INNER JOIN [dbo].[Presentaciones] AS [Extent3] ON [Extent1].[PresentacionId] = [Extent3].[PresentacionId]
        INNER JOIN [dbo].[Almacenes] AS [Extent4] ON [Extent1].[AlmacenId] = [Extent4].[AlmacenId]
        INNER JOIN [dbo].[OrdenInventarios] AS [Extent5] ON [Extent1].[OrdenInventarioId] = [Extent5].[OrdenInventarioId]
        WHERE ((2 = [Extent5].[EstadoOrden]) 
    	AND (@p__linq__0 = 1) OR ([Extent5].[NumeroOrden] LIKE @p__linq__1 ESCAPE ''~'')) 
    	OR ((@p__linq__2 = 1) AND ((convert (datetime2, convert(varchar(255), [Extent5].[Fecha], 102) ,  102)) >= @p__linq__3) 
    		AND (@p__linq__4 = 1) AND ((convert (datetime2, convert(varchar(255), [Extent5].[Fecha], 102) ,  102)) <= @p__linq__5))',
    	N'@p__linq__0 bit,
    	@p__linq__1 varchar(8000),
    	@p__linq__2 bit,
    	@p__linq__3 datetime2(7),
    	@p__linq__4 bit,
    	@p__linq__5 datetime2(7)',
    	@p__linq__0=0,
    	@p__linq__1='%%',
    	@p__linq__2=1,
    	@p__linq__3='2020-02-04 00:00:00',
    	@p__linq__4=1,
    	@p__linq__5='2020-02-21 00:00:00'

    Saludos!!!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 21 de febrero de 2020 18:04

Todas las respuestas

  • hola

    que pasa si solo dejas lo minimoen las relaciones

    var result = from po in context.ProductoOrdenes
    			 join oi in context.OrdenInventarios on po.OrdenInventarioId equals oi.OrdenInventarioId
    			 where
    			 oi.EstadoOrden == EstadoOrden.Aprobado
    			 &&
    			 (filter.HasNumberOrder && oi.NumeroOrden.Contains(filter.NumeroOrden))
    			 ||
    			 (filter.HasFechaEmisionDesde && DbFunctions.TruncateTime(oi.Fecha) >= filter.FechaEmisionDesde)
    			 &&
    			 (filter.HasFechaEmisionHasta && DbFunctions.TruncateTime(oi.Fecha) <= filter.FechaEmisionHasta)
    			 select
    			 new ProductoOrdenInventarioExtend()
    			 {
    				 Id = po.ProductoOrdenId,
    				 NumeroOrden = oi.NumeroOrden,
    				 //NombreProducto = p.Nombre,
    				 PresentacionId = po.PresentacionId,
    				 NombrePresentacion = pre.Nombre,
    				 AlmacenId = po.AlmacenId,
    				 //NombreAlmacen = a.Nombre,
    				 Cantidad = po.Cantidad,
    				 TipoOperacion = po.TipoOperacion
    			 };
    puede que alguna este agregando ese item adicional

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 21 de febrero de 2020 18:38
  • Hola

    Probé de la siguiente manera

    exec sp_executesql N'SELECT 
        [Extent1].[ProductoOrdenId] AS [ProductoOrdenId], 
        [Extent2].[NumeroOrden] AS [NumeroOrden], 
        [Extent1].[PresentacionId] AS [PresentacionId], 
        [Extent1].[AlmacenId] AS [AlmacenId], 
        [Extent1].[Cantidad] AS [Cantidad], 
        [Extent1].[TipoOperacion] AS [TipoOperacion]
        FROM  [dbo].[ProductoOrdenes] AS [Extent1]
        INNER JOIN [dbo].[OrdenInventarios] AS [Extent2] ON [Extent1].[OrdenInventarioId] = [Extent2].[OrdenInventarioId]
        WHERE ((2 = [Extent2].[EstadoOrden]) 
    	AND (@p__linq__0 = 1) AND ([Extent2].[NumeroOrden] LIKE @p__linq__1 ESCAPE ''~''))
     	OR 
    	((@p__linq__2 = 1) AND ((convert (datetime2, convert(varchar(255), [Extent2].[Fecha], 102) ,  102)) >= @p__linq__3) 
    	AND (@p__linq__4 = 1) AND ((convert (datetime2, convert(varchar(255), [Extent2].[Fecha], 102) ,  102)) <= @p__linq__5))',
    	N'@p__linq__0 bit,
    	@p__linq__1 varchar(8000),
    	@p__linq__2 bit,
    	@p__linq__3 datetime2(7),
    	@p__linq__4 bit,
    	@p__linq__5 datetime2(7)',
    	@p__linq__0=0,
    	@p__linq__1='%%',
    	@p__linq__2=1,
    	@p__linq__3='2020-02-04 00:00:00',
    	@p__linq__4=1,
    	@p__linq__5='2020-02-21 00:00:00'
    

    Me sigue trayendo ambos estados

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 21 de febrero de 2020 18:49