2012-06-30 15 views
5

Aquí es la consulta que estoy tratando de convertir en LINQ:¿Cómo puedo convertir esta consulta SQL en LINQ (OVER (partición por fecha))

SELECT R.Code, 
     R.FlightNumber, 
     S.[Date], 
     S.Station, 
     R.Liters, 
     SUM(R.Liters) OVER (PARTITION BY Year([Date]), Month([Date]), Day([Date])) AS Total_Liters 
FROM S INNER JOIN 
       R ON S.ID = R.SID 
WHERE (R.Code = 'AC') 
AND FlightNumber = '124' 
GROUP BY Station, Code, FlightNumber, [Date], Liter 
ORDER BY R.FlightNumber, [Date] 

Gracias por cualquier ayuda.

ACTUALIZACIÓN: Este es el código de Linq en el que lo estoy probando; No puedo hacer OVER PARTITION por Fecha.

var test = 
(from record in ent.Records join ship in ent.Ship on record.ShipID equals ship.ID      

orderby ship.Station 
where ship.Date > model.StartView && ship.Date < model.EndView && ship.Station == model.Station && record.FlightNumber == model.FlightNumber 

group record by new {ship.Station, record.Code, record.FlightNumber, ship.Date, record.AmountType1} into g 

select new { g.Key.Station, g.Key.Code, g.Key.FlightNumber, g.Key.Date, AmmountType1Sum = g.Sum(record => record.AmountType1) }); 
+0

¿Qué has intentado hasta ahora? Stackoverflow no es un sitio donde simplemente publica algo y le dice a la gente "Solucionarlo" o "Convertir esto", por lo que en el futuro cuando haga una pregunta, piense en eso. – Joakim

+0

Mire la actualización. –

+0

En mi experiencia, he encontrado que linqer es una herramienta realmente útil para convertir t-sql a linq. http://www.sqltolinq.com/ - Viene con una prueba gratuita de 10 días. –

Respuesta

3

ejecutar la consulta por primera vez sin la agregación:

var test = 
(from record in ent.Records join ship in ent.Ship on record.ShipID equals ship.ID      

orderby ship.Station 
where ship.Date > model.StartView && ship.Date < model.EndView && ship.Station == model.Station && record.FlightNumber == model.FlightNumber 

select new {ship.Station, record.Code, record.FlightNumber, ship.Date, record.AmountType1}; 

luego calcular la suma

var result = 
    from row in test 
    select new {row.Station, row.Code, row.FlightNumber, row.Date, row.AmountType1, 
    AmountType1Sum = test.Where(r => r.Date == row.Date).Sum(r => r.AmountType1) }; 

Esto debe producir el mismo efecto que consulta la base de datos. El código anterior puede contener errores, porque lo escribí solo aquí.

+0

INCREÍBLE 1 bilions ¡gracias! ¡Funciona de maravilla! –

1

he respondido a un hilo similar sobre: ​​LINQ to SQL and a running total on ordered results

En ese hilo era como esto:

var withRuningTotals = from i in itemList  
        select i.Date, i.Amount,  
          Runningtotal = itemList.Where(x=> x.Date == i.Date). 
                GroupBy(x=> x.Date). 
                Select(DateGroup=> DateGroup.Sum(x=> x.Amount)).Single(); 

En que situación, puede que tenga que unirse a las dos mesas primera agrupación, mientras que, luego ejecute el mismo concepto anterior en el resultado de la tabla unida.

Cuestiones relacionadas