Linq query dynamic

dynamic-linq linq

Question

I have the following linq:

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))
                             });

Additionally, I must write a condition in Where that does a dynamic filter:

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

However, IDTIENDA is included in _context.encargos and not listaEncargosAgrupados, therefore this Where is incorrect.

How can I solve this issue?

Thanks

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

Accepted Answer

Finally, using executestorequery inside the context of my EF to create a SQL query was the answer to my issue.

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 a grouping assertion,IDTIENDA list as the outcome:

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