2016-04-14 8 views
-4

Ist es sogar möglich, die folgende Abfrage mit LINQ zu schreiben? Ich habe den ganzen Tag kämpfen, :(Konvertieren von SQL nach LINQ mit Group By und Max

select * from ProductGroup pg 
Inner join (
    select max(DateShipped) as ShipDate 
     , ProductId 
    from Lot lt 
    group by ProductId) lte 
    on pg.ProductId = lte.ProductId 

Antwort

1

Solution1

Getestet habe ich diese auf LinqPad LinqToSQL mit

var data = from lt in Lots    
      group lt by lt.ProductId into grp 
      join pg in ProductGroups on grp.Key equals pg.ProductId 
      select new { pg.ProductId,pg.ProductName,ShipDate =grp.Max (g => g.ShipDate)}; 

data.Dump(); 

und Es produziert dieses SQL (fast wie Ihre SQL, nur Reihenfolge der Tabellen ist geschaltet

)
SELECT [t2].[ProductId], [t2].[ProductName], [t1].[value] AS [ShipDate] 
FROM (
    SELECT MAX([t0].[ShipDate]) AS [value], [t0].[ProductId] 
    FROM [Lot] AS [t0] 
    GROUP BY [t0].[ProductId] 
    ) AS [t1] 
INNER JOIN [ProductGroup] AS [t2] ON [t1].[ProductId] = [t2].[ProductId] 

Solution2

Dies ist eine Möglichkeit, eine korrelierte Unterabfrage, die gleichen Ergebnis führt zu zwingen, wie Sie wollen, aber ohne/Gruppe beitreten, indem

var data = from pg in ProductGroups 
      let sd = Lots.Where (l => l.ProductId == pg.ProductId).Max(l => l.ShipDate) 
      select new { pg.ProductId,pg.ProductName,ShipDate =sd}; 

    data.Dump(); 

und es erzeugt Dieses SQL

SELECT [t0].[ProductId], [t0].[ProductName], (
    SELECT MAX([t1].[ShipDate]) 
    FROM [Lot] AS [t1] 
    WHERE [t1].[ProductId] = [t0].[ProductId] 
    ) AS [sd] 
FROM [ProductGroup] AS [t0] 

Ich hoffe, es wird Ihnen helfen

+0

Danke, das hat mir ein bisschen geholfen. Aber ich muss 2 Felder auf Group By-Klausel in der 1. Tabelle und ziehen Sie ein anderes Element aus der 2. Tabelle, musste ich leicht ändern, um in LINQ in Ordnung zu laufen. – bhishan

0

starten.

var result = (from pg in ProductGroup 
       join lte in 
       (
        from lt in Lot 
        group lt by lt.ProductId into gr 
        select new 
        { 
         ProductId = gr.Key, 
         ShipDate = gr.Max(x => x.DateShipped) 
        } 
       ) 
       on pg.ProductId equals lte.ProductId 
       select new 
       { 
        ID = pg.ProductId, 
        MaxShipDate = lte.ShipDate 
       }).ToList(); 
+0

Ich weiß nicht, ob dies Pseudocode oder eine echte Sprache gemeint ist, aber was auch immer es ist, es ist nicht C#. – hvd

+0

Danke für die Antwort. Ich benutzte eine zweite Gruppierung und wählte den letzten Gegenstand, nahm mich eine Weile, aber ich habe es jetzt. – bhishan