2011-04-24 9 views
1

このローリング平均SQL文に相当するLINQを書き込もうとしていますが、同じ表(BulbSales)を使用する方法には、xyという2回のエイリアスを使用する方法がありません。SQLをLINQに変換する:ローリング平均

お手伝いできますか?

SELECT x.Id, AVG(y.Sales) moving_average 
FROM BulbSales x, BulbSales y 
WHERE x.Id>=6 AND x.Id BETWEEN y.Id AND y.Id+5 
GROUP BY x.Id 
ORDER BY x.Id 
+1

何LINQプロバイダを? Linq2SQL、NHibernate、エンティティフレームワーク、LLBLGen、..何か他の? –

+1

あなたLinqPad(窓用)cehckする必要があります、それはあなたがその場でlinqを行うことができますし、さらにdbに接続します。それはきちんとしている! –

+0

+1のLINQPadの提案^^ –

答えて

1

これはSQLにLINQであれば、あなたは試すことができます:

var query = from x in context.BulbSales 
      from y in context.BulbSales 
      where x.Id >= 6 && x.Id >= y.Id && x.Id <= (y.Id + 5) 
      group new { x.Id, y.Sales } by x.Id into g 
      orderby g.Key 
      select new { Id = g.Key, Average = g.Average(tuple => tuple.Sales) }; 

これは、SQL生成:

SELECT [t2].[Id], [t2].[value] AS [Average] 
FROM (
    SELECT AVG([t1].[Sales]) AS [value], [t0].[Id] 
    FROM [dbo].[BulbSales] AS [t0], [dbo].[BulbSales] AS [t1] 
    WHERE ([t0].[Id] >= @p0) AND ([t0].[Id] >= [t1].[Id]) AND ([t0].[Id] <= ([t1].[Id] + @p1)) 
    GROUP BY [t0].[Id] 
    ) AS [t2] 
ORDER BY [t2].[Id] 
+0

これは自己結合のようです。そのように表現する方が良いか、それとも重要ではないですか? – nycdan

+0

@nycdan:これは等価結合ではないので、通常は 'SelectMany'(2つの' from'節)が最適です。 – Ani

+0

興味深い。私はそれらを前に比較することは考えていませんでしたが、今見ていると、ほとんどの場合、パフォーマンスの違いは重要ではないと感じ、気分が最高になると思います。いずれにせよ、別の選択肢があるのは良いことです。ありがとう。 – nycdan

関連する問題