【发布时间】:2012-12-05 15:37:03
【问题描述】:
如何针对我的 Calendar 和 Sales 表编写以下 LEFT OUTER JOIN SQL 查询,以便在 LINQ 中按天、周或月对总销售额进行分组,以便可以通过 LINQ-to- SQL?
SELECT c.CalendarDate, c.FirstDayOfWeek, c.FirstDayOfMonth,
ISNULL(s.Total, 0) as Total
FROM Calendar as c
LEFT OUTER JOIN Sales as s
on s.SaleDate >= c.CalendarDateTime and
s.SaleDate < c.NextDayDateTime
WHERE s.SaleDate BETWEEN @since and @until
我设法让 inner join 在 LINQ 中工作,但我需要一个外连接来检索零销售额的日子。这是我用于内部连接的代码:
var sales = from s in db.Sales
from c in db.Calendars
where
s.SaleDate >= c.CalendarDate && s.SaleDate < c.NextDayDateTime
&& s.SaleDate >= sinceDate && s.SaleDate < dateEnd
select new
{
c.CalendarDate,
c.FirstDateOfWeek,
c.FirstDateOfMonth,
s.Total
};
然后我可以按如下方式打开日期间隔和分组销售:
每日:
var groupedSales = sales.GroupBy(x => x.CalendarDate);
每周:
var groupedSales = sales.GroupBy(x => x.FirstDateOfWeek);
每月:
var groupedSales = sales.GroupBy(x => x.FirstDateOfMonth);
最后:
var salesReport = from g in groupedSales
orderby g.Key
select new {
Date = g.Key,
Total = g.Sum(x => x.Total)
};
或者,它也可以在仅检索非零天的销售后将零销售记录注入我的报告中。
【问题讨论】:
-
您的 SQL 语句不会运行 LEFT OUTER JOIN,因为您在 WHERE 语句中使用 Sales 表而不是进行 NULL 检查。
-
@cjk,已修复。感谢您指出这一点(我的结局就是这样)。也许如果我添加一个??对于我的 LINQ 查询,它会推断出左外连接?
标签: c# sql sql-server linq linq-to-sql