Linq查询动态

时间:2016-06-15 10:39:39

标签: linq dynamic-linq

我有这个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))
                             });

我需要在 Where 中创建一个条件,动态过滤:

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

这是不正确的,因为 _context.encargos 中包含 IDTIENDA ,而 listaEncargosAgrupados 中没有

我如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:0)

e添加到分组语句中,并将IDTIENDA列表添加到结果中:

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

答案 1 :(得分:0)

最后我的问题的解决方案是在我的EF上下文中使用executestorequery,并创建一个SQL查询:

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;