hola
bien esta bastante compleja la consulta, mas que anda porque involucra varias tablas
hay algunso puntos que me quedan en duda, ya que la query en sql no lo refleja
los campos del select a que tabla hacen referencia ?
SELECT
Departamento,
SUM ( Cantidad* Precio) AS Total
es que le faltan las alias a estos campos, imagino que no son todos campos de la tabla SalidasAlmacen, los alias ayudarian seria bueno definirlos simpre en la query
intente aproximarlo algo mas pero igual no creo que funcione, ademas no puedo probarlo
hasta donde llegue, podrias hacer algo como esto:
var Costo = (from sa in dc.SalidasAlmacen
join ca in dc.CatArticulos
on sa.CveArticulo equals ca.CveArticulo
join cd in dc.CatDepartamentos
on sa.CveDepartamento equals cd.CveDepartamento
from depas in _depas
where sa.DeptoSalida == ca.CveDepartamento && ca.Tipo == 'C' && cd.Tipo == 'C' &&
sa.Fecha >= fi && sa.Fecha <= ff && sa.DeptoSalida == 49 && cd.CveSucursal == suc
&& sa.CveDepartamento == depas
group sa by cd.Departamento into grp
select new
{
Departamento = grp.Key,
Cantidad = grp.Sum(x => x.Cantidad),
Precio = grp.Sum(x => x.Precio)
});
algunos punto, en el group by no necesitas usar el new ya que es solo por un campo por el cual agrupas : group sa by cd.Departamento into grp
por el tema de calcular directo el total, no estoy seguro que puedas, pero si agrupas por cantidad y precio para ese depto, podrias luego cuando lo trabajes en la lista multiplicarlo, o podrias crar una clase que lo haga
public class DeptoInfo
{
public string Departamento{get; set;}
public int Cantidad{get; set;}
public int Precio{get; set;}
public int Total
{
get{ return this.Cantidad * this.Precio;}
}
}
y tu linq seria
var Costo = (from sa in dc.SalidasAlmacen
join ca in dc.CatArticulos
on sa.CveArticulo equals ca.CveArticulo
join cd in dc.CatDepartamentos
on sa.CveDepartamento equals cd.CveDepartamento
from depas in _depas
where sa.DeptoSalida == ca.CveDepartamento && ca.Tipo == 'C' && cd.Tipo == 'C' &&
sa.Fecha >= fi && sa.Fecha <= ff && sa.DeptoSalida == 49 && cd.CveSucursal == suc
&& sa.CveDepartamento == depas
group sa by cd.Departamento into grp
select new DeptoInfo()
{
Departamento = grp.Key,
Cantidad = grp.Sum(x => x.Cantidad),
Precio = grp.Sum(x => x.Precio)
});
o sea creas una instancia que ya no es mas anonima, asi podrias luego suar la propiedad de Total que esta clase define de solo lectura
otro punto que estoy en duda es el uso de _depas, este deberias agregarlo como un "from" en la query para que tome parte de la consulta y puedas igualar a un campo, sino es como si estuviera desacomplado.
lo que si no estoy seguro es si ese from va junto al primero que defines, o puedes ponerlo al fina, como arme en el ejemplo
como comente la query es bastante compleja, pero creo que si la armas de a poco y vas a analziando los rsultado podrias ayudar
por ejemplo al prncipio podrias quitar los filtros, y verifica que asi funcione
var Costo = (from sa in dc.SalidasAlmacen
join ca in dc.CatArticulos
on sa.CveArticulo equals ca.CveArticulo
join cd in dc.CatDepartamentos
on sa.CveDepartamento equals cd.CveDepartamento
from depas in _depas
group sa by cd.Departamento into grp
select new
{
Departamento = grp.Key,
Cantidad = grp.Sum(x => x.Cantidad),
Precio = grp.Sum(x => x.Precio)
});
luego ve agregandole dificultad de a poco, si armas todo de golpe sea dificil que encuantees porque falla
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina