【问题标题】:Count minus Count in GroupBy in LinqLinq 中的计数减去 GroupBy 中的计数
【发布时间】:2016-10-21 12:35:02
【问题描述】:

我有一个问题,我需要以下方面的建议: 我得到了一张表(CurrentItems),其中包含以下列:Id、ChangedTime、Status、ItemType、Company

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

示例表包含:

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 中执行此操作,我将使用两个选择并从另一个中减去,但我认为可以在 LINQ 中以更紧凑的方式编写它。

【问题讨论】:

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


    【解决方案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()
       });
    

    它会给你每家公司的总和。

    【讨论】:

    • 请注意,您可以将 Where(lambda).Count() 更改为 Count(lambda)
    • 是的,你是对的,只是海关,当有 Where 子句时我看的更清楚,因为它更接近 SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多