1

この次の SQL クエリ (別のテーブルとの CTE LEFT JOINED) をラムダまたはクエリ式として記述するにはどうすればよいですか?

WITH Hours as
(
    SELECT 0 As Hour
    UNION ALL
    SELECT Hour + 1
    FROM Hours
    WHERE Hour + 1 < 24
)
SELECT Hours.Hour, COALESCE(Revenue, 0) FROM Hours 
LEFT JOIN
(
SELECT DATEPART(hh, TableDate) As Hour, SUM(Revenue) Revenue FROM MyTable 
GROUP BY DATEPART(hh, TableDate)
) c
ON 
c.Hour = Hours.Hour

GroupJoin と SelectMany を使用して LEFT JOIN を実行できることはわかっていますが、クエリの CTE 部分の表現をどこから始めればよいかわかりません。ラムダまたはクエリ式でこれを行うには、静的テーブルを作成する必要がありますか?

- 編集 -

だから私は最終的にこれになりました(読みやすさのためにラムダよりもクエリ式を好みました):

    var revenue = (
                   from range in Enumerable.Range(0, 23)
                   join conv in db.MyTable on range equals conv.TableDate.Hour into c
                   from d in c.DefaultIfEmpty()
                   group d by range into g
                   select new { Hour = g.Key, Revenue = g.Sum(e => e == null ? 0.0 : e.Revenue), }
                  )
4

2 に答える 2

2

あなたのモデルがlinqでどうなるかを正確に伝えるのは難しいですが、おそらく次のようなものです:

var Enumerable.Range(0,23)
      .Join(MyTable.GroupBy(x => x.TableDate.Hour())
             .Select(g => new { hour = g.Key, rev = g.Revenue.Sum() },
            h => h,
            g => g.hour,
            (h , g) -> new { hour = h, revenue = g.rev });
于 2013-11-03T00:23:44.337 に答える
1

同等の linq クエリ式

from a in Enumerable.Range(0, 24)
join b in Mytables on a equals b.TableDate.Hour into c
from d in c.DefaultIfEmpty()
group d by a into g
select new {h = g.Key, s = g.Sum(e => e == null ? 0.0m : e.Revenue)}
于 2013-11-03T00:51:03.360 に答える