Linq query dynamic

dynamic-linq linq

Question

I've this linq query:

var query = (from l in _contexto.lineasencargos
                             join a in _contexto.articulos on l.IDARTICULO equals a.IDARTICULO
                             join af in _contexto.articulofamilia on a.IDARTICULO equals af.IDARTICULO
                             join f in _contexto.familias on af.IDFAMILIA equals f.IDFAMILIA
                             join e in _contexto.encargos on l.IDENCARGO equals e.IDENCARGO
                             where e.FECHAHORAENCARGOS >= _finder.FechaDe &&
                                e.FECHAHORAENCARGOS <= _finder.FechaA &&
                                e.FECHAHORARECOGERENCARGOS >= _finder.FechaRecogerDe &&
                                e.FECHAHORARECOGERENCARGOS <= _finder.FechaRecogerA &&
                                e.clientes.RAZONSOCIALCLIENTE.Contains(_finder.Cliente)
                         group l by new  { l.IDARTICULO, l.CANTIDADLINEAENCARGO,a.DESCRIPCIONARTICULO,f.DESCRIPCION,f.IDFAMILIA }
                             into g
                                 select new listaEncargosAgrupados
                             {
                                 IdArticulo=(int)g.Key.IDARTICULO,
                                 DescripcionArticulo=g.Key.DESCRIPCIONARTICULO,
                                 IdFamilia=g.Key.IDFAMILIA,
                                 DescripcionFamilia=g.Key.DESCRIPCION,
                                 SumaCantidad = (decimal)g.Sum(x => x.CANTIDADLINEAENCARGO),
                                 SumaPrecio = (decimal)g.Sum(x => x.PRECIOLINEAENCARGO),
                                 Total = (decimal)((decimal)g.Sum(x => x.CANTIDADLINEAENCARGO) * g.Sum(x => x.PRECIOLINEAENCARGO))
                             });

and i need create a condition in Where, that filter dynamically:

if (_finder.IdTienda > 0)
                {
                    query = query.Where(x=>x.IDTIENDA == _finder.IdTienda); 
                }

But this Where it is not correct because IDTIENDA is contained in _context.encargos and not in listaEncargosAgrupados

How i can revolve this problem?

Thanks

1
1
6/15/2016 10:39:38 AM

Accepted Answer

Finally the solution to my problem was to employ executestorequery in the context of my EF, and creat a SQL query :

List<ListaEncargosAgrupados> lista;
string queryString = @"SELECT l.IDARTICULO,a.DESCRIPCIONARTICULO,f.DESCRIPCION descripcionFamilia,f.IDFAMILIA,sum(l.CANTIDADLINEAENCARGO) sumaCantidad,avg(l.PRECIOLINEAENCARGO) 

sumaPrecio,sum(l.CANTIDADLINEAENCARGO)*avg(l.PRECIOLINEAENCARGO) Total " +
    "FROM lineasencargos l,articulos a,articulofamilia af,familias f,encargos e " +
    "where a.IDARTICULO=l.IDARTICULO and a.IDARTICULO=af.IDARTICULO " +
    "and af.IDFAMILIA=f.IDFAMILIA and l.IDENCARGO=e.IDENCARGO ";


                if (_finder.IdTienda > 0)
                {
                    queryString = queryString + " and e.idtienda=" + _finder.IdTienda;
                }

                queryString = queryString + " group by l.IDARTICULO,a.DESCRIPCIONARTICULO,f.DESCRIPCION,f.IDFAMILIA order by a.DESCRIPCIONARTICULO ";

                var salidaQuery = _contexto.ExecuteStoreQuery<ListaEncargosAgrupados>(queryString).AsQueryable().ToList();
                lista = salidaQuery;
0
6/22/2016 8:34:02 AM

Popular Answer

Add e into grouping statement and IDTIENDA list into the result:

var query = (from l in _contexto.lineasencargos
                             join a in _contexto.articulos on l.IDARTICULO equals a.IDARTICULO
                             join af in _contexto.articulofamilia on a.IDARTICULO equals af.IDARTICULO
                             join f in _contexto.familias on af.IDFAMILIA equals f.IDFAMILIA
                             join e in _contexto.encargos on l.IDENCARGO equals e.IDENCARGO
                             where e.FECHAHORAENCARGOS >= _finder.FechaDe &&
                                e.FECHAHORAENCARGOS <= _finder.FechaA &&
                                e.FECHAHORARECOGERENCARGOS >= _finder.FechaRecogerDe &&
                                e.FECHAHORARECOGERENCARGOS <= _finder.FechaRecogerA &&
                                e.clientes.RAZONSOCIALCLIENTE.Contains(_finder.Cliente)
                         group new { l, e} by new  { l.IDARTICULO, l.CANTIDADLINEAENCARGO,a.DESCRIPCIONARTICULO,f.DESCRIPCION,f.IDFAMILIA }
                             into g
                                 select new { Result = new listaEncargosAgrupados
                             {
                                 IdArticulo=(int)g.Key.IDARTICULO,
                                 DescripcionArticulo=g.Key.DESCRIPCIONARTICULO,
                                 IdFamilia=g.Key.IDFAMILIA,
                                 DescripcionFamilia=g.Key.DESCRIPCION,
                                 SumaCantidad = (decimal)g.Sum(x => x.l.CANTIDADLINEAENCARGO),
                                 SumaPrecio = (decimal)g.Sum(x => x.l.PRECIOLINEAENCARGO),
                                 Total = (decimal)((decimal)g.Sum(x => x.l.CANTIDADLINEAENCARGO) * g.Sum(x => x.l.PRECIOLINEAENCARGO))
                             },
                             IDTIENDAs = new HashSet<int>(from x in g
                                                          let id = x.e.IDTIENDA
                                                          where id.HasValue
                                                          select  (int)id.Value)
});
...
if (_finder.IdTienda > 0)
{
    query = query.Where(x => x.IDTIENDAs.Contains (_finder.IdTienda));
}
var query1 = query.Select(x => x.Result);


Related Questions





Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow