2016-04-14 51 views
-4

LINQを使用して次のクエリを記述することはできますか?私は、一日中戦ってきた:(Group ByとMaxを使用してSQLをLINQに変換する

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

答えて

1

ソリューション1

私はLinqToSQLを使用してLinqPadでこれをテストした

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

とそれはこのSQLを生成しました(ほとんどあなたのSQLのように、テーブルの順序だけが切り替えられます)

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] 

対処方法2

これであなたが望むのと同じ結果を生成しますが

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

、それが発生したことにより、参加/グループなしの相関サブクエリを強制するための一つの方法この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] 

私はあなたに役立つことを願っています

+0

ありがとう、これは私を少し助けました。しかし、私は最初のテーブルのGroup By節に2つのフィールドを入れ、2番目のテーブルから別のアイテムを引き出す必要がありました.LINQで正常に動作するように少し修正しなければなりませんでした。 – bhishan

0

はこれを試してみてください。

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

これは擬似コードまたは実際の言語であることを意図しているかどうかわかりませんが、それが何であれ、それはC#ではありません。 – hvd

+0

返事をありがとう。私は2番目のグループを使用し、最新のアイテムを選んで、私をしばらく取りましたが、今は持っています。 – bhishan

関連する問題