2011-03-03 29 views
3

这是我试图解决的问题。我有3个数据库表 - 销售,客户和时间。一个销售记录链接到一个客户记录和一个时间记录。我想,仅在1996年,查看按地区划分的总销售额(客户与特定区域相关),以下是进一步的划分:假期,非假期,平日和周末。这里是我迄今粗略的查询,我试图在评论中添加。在使用闭包的LINQ语句中,是否可以在闭包中指定where子句?

var totalSales = 
    from s in sales 
    where s.Time.Year = 1996 
    group s by s.Customer.Region into g 
    select new { Region = g.Key, 
       Holidays = g.Sum(s => s.Total_Amount), // WHERE (s => s.Time.Holiday_flag = true) 
       NonHolidays = g.Sum(s => s.Total_Amount), // WHERE (s => s.Time.Holiday_flag = false) 
       Weekdays = g.Sum(s => s.Total_Amount), // WHERE (s => s.Time.Weekday_flag = true) 
       Weekends = g.Sum(s => s.Total_Amount)}; // WHERE (s => s.Time.Weekday_flag = false) 

为此,我需要能够在每个闭包中进一步限制结果。这可能吗?我是否需要重构查询?我当然可以通过将其分解为4个单独的查询来完成此任务,但是在一个查询中完成这项工作真的很不错。

谢谢。

回答

6

好了,你可以试试这个:

Holidays = g.Where(s => s.Time.Holiday_flag).Sum(s => s.Total_Amount), 
NonHolidays = g.Where(s => !s.Time.Holiday_flag).Sum(s => s.Total_Amount), 
Weekdays = g.Where(s => s.Time.Weekday_flag).Sum(s => s.Total_Amount), 
Weekends = g.Where(s => !s.Time.Weekday_flag).Sum(s => s.Total_Amount) 

或:

Holidays = g.Sum(s => s.Time.Holiday_flag ? s.Total_Amount : 0), 
// etc 
+0

+1 - 我只是工作这件事。一如既往,太快............ – 2011-03-03 17:25:05

+0

这很完美,非常感谢。 – rybosome 2011-03-03 17:30:25