计数减去Linq中GroupBy中的Count

时间:2016-10-21 12:35:03

标签: c# linq lambda linq-to-entities

我有一个问题,我需要提出以下建议: 我有一个表(CurrentItems)列:Id,ChangedTime,Status,ItemType,Company

“状态”列包含一个数字,其中1表示已添加,3表示已删除
我需要计算某个公司在某个时间点的项目总数。任何itemtype都可以添加多次。

示例表包含:

1. Company A add(1) Item 1 at 2001-01-01
2. Company B add(1) Item 1 at 2001-02-01
3. Company A removes(3) Item 1 at 2001-03-01
4. Company B add(1) Item 1 at 2001-04-01
5. Company B removes(3) Item 1 at 2001-05-01
6. Company A add(1) Item 1 at 2001-06-01
7. Company A add(1) Item 1 at 2001-07-01
8. Company B removes(3) Item 1 at 2001-08-01

如果我查看2001-05- 02 ,那么结果应为

Company A totalitems on date: 0
Company B totalitems on date: 1

如果我看一下2001-08- 02 ,结果应该是

Company A totalitems on date: 2
Company B totalitems on date: 0

如果可能的话,在lambda语句中使用解决方案会很好。

我到底有多远?

 CurrentItems.Where(o=> (o.Status==1 || Status==3) && o.UpdatedTime <
     DateTime.Parse("2001-08-02") &&o.Company="A").GroupBy(z=>z.Status)
     .Select(z=> new
     {
     Name=z.Key, 
     Summa=z.Count(),
     }
...

如果我在SQL中执行此操作,我将使用两个select并从另一个中减去,但我认为可以在LINQ中以更紧凑的方式编写它。

1 个答案:

答案 0 :(得分:1)

您可以这样做:

 CurrentItems.Where(o=> o.UpdatedTime < DateTime.Parse("2001-08-02")
   .GroupBy(z=>z.Company)
   .Select(z=> new
   {
       Name=z.Key, 
       Summa=z.Where(i => i.Status == 1).Count() - z.Where(i => i.Status == 3).Count()
   });

它将为您提供每家公司的总和。