Linq查询动态
我有一个linq查询:Linq查询动态,linq,dynamic-linq,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.IDA
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))
});
但此处的不正确,因为IDTIENDA包含在\u上下文中。encargos而不在列表中
我怎样才能解决这个问题
谢谢将
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);
var query=(来自l in _contexto.lineasencargos
在l.IDARTICULO上加入a_contexto.articulos等于a.IDARTICULO
将af加入a.IDARTICULO上的_contexto.articulofamilia等于af.IDARTICULO
将f加入到f上的家庭上下文中。f.IDFAMILIA等于f.IDFAMILIA
在l.IDENCARGO上的_contexto.encargos中加入e。IDENCARGO等于e.IDENCARGO
其中e.fechahorancargos>=\u finder.FechaDe&&
e、 fechahorancargos=\u finder.FechaRecogerDe&&
e、 Fechahora Recogerencargos x.l.Cantidadlineacargo),
SumaPrecio=(十进制)g.Sum(x=>x.l.preciolineancargo),
总计=(十进制)((十进制)g.Sum(x=>x.l.cantidadlineancargo)*g.Sum(x=>x.l.preciolineancargo))
},
IDTIENDAs=新哈希集(从g中的x开始)
设id=x.e.IDTIENDA
其中id.HasValue
选择(int)id.Value)
});
...
如果(_finder.IdTienda>0)
{
query=query.Where(x=>x.IDTIENDAs.Contains(_finder.IdTienda));
}
var query1=query.Select(x=>x.Result);
将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);
var query=(来自l in _contexto.lineasencargos
在l.IDARTICULO上加入a_contexto.articulos等于a.IDARTICULO
将af加入a.IDARTICULO上的_contexto.articulofamilia等于af.IDARTICULO
将f加入到f上的家庭上下文中。f.IDFAMILIA等于f.IDFAMILIA
在l.IDENCARGO上的_contexto.encargos中加入e。IDENCARGO等于e.IDENCARGO
其中e.fechahorancargos>=\u finder.FechaDe&&
e、 fechahorancargos=\u finder.FechaRecogerDe&&
e、 Fechahora Recogerencargos x.l.Cantidadlineacargo),
SumaPrecio=(十进制)g.Sum(x=>x.l.preciolineancargo),
总计=(十进制)((十进制)g.Sum(x=>x.l.cantidadlineancargo)*g.Sum(x=>x.l.preciolineancargo))
},
IDTIENDAs=新哈希集(从g中的x开始)
设id=x.e.IDTIENDA
其中id.HasValue
选择(int)id.Value)
});
...
如果(_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;
列表列表a;
string queryString=@“选择l.IDARTICULO、a.DescriptionActiculo、f.DescriptionDescriptionFamilia、f.IDFAMILIA、sum(l.CantidadlineanCargo)sumaCantidad、avg(l.PreciolineanCargo)
sumaPrecio,总计(l.Cantidadlineancargo)*平均(l.Preciolineancargo)总计”+
来自lineasencargos l、articulos a、Articulo Familia af、familias f、encargos e+
“其中a.IDARTICULO=l.IDARTICULO和a.IDARTICULO=af.IDARTICULO”+
“和af.IDFAMILIA=f.IDFAMILIA和l.IDENCARGO=e.IDENCARGO”;
如果(_finder.IdTienda>0)
{
queryString=queryString+”和e.idtienda=“+\u finder.idtienda;
}
queryString=queryString+“按l.IDARTICULO分组,a.DESCRIPCIONATICULO,f.DESCRIPCION,f.IDFAMILIA按a.DESCRIPCIONATICULO排序”;
var salidaQuery=_contexto.ExecuteStoreQuery(queryString.AsQueryable().ToList();
lista=salidaQuery;
最后,我的问题的解决方案是在我的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;
列表列表a;
string queryString=@“选择l.IDARTICULO、a.DescriptionActiculo、f.DescriptionDescriptionFamilia、f.IDFAMILIA、sum(l.CantidadlineanCargo)sumaCantidad、avg(l.PreciolineanCargo)
sumaPrecio,总计(l.Cantidadlineancargo)*平均(l.Preciolineancargo)总计”+
来自lineasencargos l、articulos a、Articulo Familia af、familias f、encargos e+
“其中a.IDARTICULO=l.IDARTICULO和a.IDARTICULO=af.IDARTICULO”+
“和af.IDFAMILIA=f.IDFAMILIA和l.IDENCARGO=e.IDENCARGO”;
如果(_finder.IdTienda>0)
{
queryString=queryString+”和e.idtienda=“+\u finder.idtienda;
}
queryString=queryString+“按l.IDARTICULO分组,a.DESCRIPCIONATICULO,f.DESCRIPCION,f.IDFAMILIA按a.DESCRIPCIONATICULO排序”;
var salidaQuery=_contexto.ExecuteStoreQuery(queryString.AsQueryable().ToList();
lista=salidaQuery;
listaEncargosAgrupados是类,listaEncargosAgrupados类必须包含在group by子句中的_context.encargos中可用的IDTIENDA项SADD IDTIENDA,以便您可以在最终选择投影中将其作为listaEncargosAgrupados的公共属性进行投影。将group by子句更改为-group l by new{l.IDARTICULO,l.CANTIDADLINEAENCARGO,a.DESCRIPCIONATICULO,f.DESCRIPCION,f.IDFAMILIA,e.IDTIENDA}
我不喜欢group by中的IDTIENDA,我只需要将其保留在.listaEncargosAgrupados为class且listaEncargosAgrupados为mu的子句中