Linq 查询动态

Linq query dynamic

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

但是这个 Where 是不正确的,因为 IDTIENDA 包含在 _context.encargos 而不是 listaEncargosAgrupados

我该如何解决这个问题?

谢谢

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

最后,我的问题的解决方案是在我的 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;