首页 > 解决方案 > Linq 组通过提供不正确的统计信息

问题描述

我有一个表格,我想从中计算以下状态的统计信息:

预期输出

Active = 12
OnHold = 10
Closed = 14
Filled = 15
Expired = 24

查询一:

var statistics = (from j in context.Job
                  where j.CompanyID == 100 &&
                  {100,101,102,103, 104 }.Contains(j.StatusID) 
                 (j.ActiveDate == "0001-01-01" ? (j.CreationDate >= fromDate && j.CreationDate <= toDate):
                 (j.ActiveDate >= fromDate && j.fromDate <= today))
                 group j by new
                 {
                    j.StatusID
                 }
                 into g
                 select new
                 {
                    ActiveStats = g.Count(inner => (inner.StatusID == 100)),
                    OnHoldStats = g.Count(inner => (inner.StatusID == 101)),
                 }).FirstOrDefault();

对于上述查询,我​​得到的“ActiveStats”和“OnHoldStats”统计数据不正确。

查询 2:

var statistics = (from j in context.Job
                  where j.CompanyID == 100 &&
                  {100,101,102,103, 104 }.Contains(j.StatusID) 
                 (j.ActiveDate == "0001-01-01" ? (j.CreationDate >= fromDate && j.CreationDate <= toDate):
                 (j.ActiveDate >= fromDate && j.fromDate <= today))
                 group j by 1 into g
                 into g
                 select new
                 {
                    ActiveStats = g.Count(inner => (inner.StatusID == 100)),
                    OnHoldStats = g.Count(inner => (inner.StatusID == 101)),
                 }).FirstOrDefault();

对于上述查询,我​​得到了正确的“ActiveStats”和“OnHoldStats”统计信息。

我只是不明白为什么查询 1 的结果不正确,为什么查询 2 的结果正确?

另外,哪个查询在性能方面更有效?

我很想了解这两个查询之间的区别,以及在效率和性能方面我应该选择哪个查询。

标签: c#entity-frameworklinqgroup-by

解决方案


根据所需的输出,您必须运行以下查询:

var query = 
    from j in context.Job
    where j.CompanyID == 100 &&
        {100,101,102,103, 104 }.Contains(j.StatusID) 
        (j.ActiveDate == "0001-01-01" ? (j.CreationDate >= fromDate && j.CreationDate <= toDate):
        (j.ActiveDate >= fromDate && j.fromDate <= today))
    group j by new { j.StatusID } into g
    select new
    {
        StatusName = 
             j.Key.StatusID == 100 ? "Active" 
           : j.Key.StatusID == 101 ? "OnHold" 
           : j.Key.StatusID == 102 ? "Closed"
           : j.Key.StatusID == 103 ? "Filled"
           : "Expired",
        Count = g.Count()
    };

var statistics = query.ToList();

推荐阅读