0

我有一种用于生成摘要报告的方法,该方法基于用户在选择列表中选择的选项,以计算在某个区域内完成的一种测试类型的数量,其中包含子集位置,在一个日期范围内。

数据如下所示: 2015 年 2 月 1 日至 2015 年 3 月 1 日按地点完成的测试计数

Total  TestType  Location  Region  Division
455    24 Hour   Lab 1     City 1  Division A
28     24 Hour   Lab 2     City 1  Division A
95     24 Hour   Clinic Z  City 2  Division A
189    24 Hour   Clinic Y  City 2  Division A

以下是同一时间段内不同测试类型的情况:

Total  TestType  Location  Region  Division
285    48 Hour   Lab 1     City 1  Division A
12     48 Hour   Lab 2     City 1  Division A
75     48 Hour   Clinic Z  City 2  Division A
106    48 Hour   Clinic Y  City 2  Division A

现在,用户希望testType在一个报告中查看汇总细分(在 SQL 中,将另一个属性添加到分组依据)。在我的选择列表中testTypeId,我使用 0 作为我的“全部”项目。IQueryable在一个完美的世界中,我会在if中添加另一个内容testTypeId == 0,这样我就可以保留相同的私有方法,而不是编写新的查询。

以下是我们希望数据在“ALL”情况下的样子:

Total  TestType  Location  Region  Division
455    24 Hour   Lab 1     City 1  Division A
285    48 Hour   Lab 1     City 1  Division A
59     12 Lead   Lab 1     City 1  Division A
28     24 Hour   Lab 2     City 1  Division A
12     48 Hour   Lab 2     City 1  Division A
95     24 Hour   Clinic Z  City 2  Division A
75     48 Hour   Clinic Z  City 2  Division A
5      12 Lead   Clinic Z  City 2  Division A
189    24 Hour   Clinic Y  City 2  Division A
106    48 Hour   Clinic Y  City 2  Division A
8      12 Lead   Clinic Y  City 2  Division A

下面的示例显示了我想要添加的内容,但语法告诉我,我不能接受IQueryable包含 anIGrouping并将其转换为IQueryable.

任何人都可以在这里指出一个好的方向吗?

private CompletedCountReport GetCompletedCountsByRegion(int regionId, DateTime? startDate, DateTime? endDate, int testTypeId)
{
    var ccRpt = new CompletedCountReport { CompletedCounts = new List<CompletedCount>(), StartDate = startDate, EndDate = endDate, SelectedRegionID = regionId};

    var query = HolterTestDao.FindAll(new GetCompletedByRegionIdAndDates(regionId, startDate.Value, endDate.Value));

    // a specific test type was selected
    if (testTypeId > 0)
    {
        query = query.Where(x => x.HolterTestType == testTypeId);
    }
    // THIS IS WHAT I WANT TO ADD -> otherwise group by test type  <-  THIS IS WHAT I WANT TO ADD.
    if (testTypeId == 0)
    {
        query = query.GroupBy(x => x.HolterTestType);
    }
    // order by locationID within the region.
    query = query.OrderBy(x => x.Location.ID);

    var htList = query.ToList();

    // now Group by Location, to get counts. 
    var reportContents = htList.GroupBy(x => x.Location.ID);
    foreach (var r in reportContents)
    {
        var rList = r.ToList();

        var cc = new CompletedCount();
        var loc = LocationDao.FindById(r.Key);
        cc.Description = loc.Description;
        cc.RegionId = loc.Region.ID;
        cc.DivisionId = loc.Region.Division.ID;
        cc.TestTypeId = testTypeId;
        cc.Count = rList.Count;
        ccRpt.CompletedCounts.Add(cc);
    }

    return ccRpt;
}
4

1 回答 1

0

我的解决方案是 OrderBy Location 和 HolterTestType,然后是基本内容的 GroupBy location,然后在我的循环中添加另一个分组,通过结果来获取测试类型的计数:

        query = query.OrderBy(x => x.Location.ID).ThenBy(x => x.HolterTestType);
        var htList = query.ToList();

        // now Group by Location. 
        var reportContents = htList.GroupBy(x => x.Location.ID);

        foreach (var r in reportContents)
        {
            //Group by TestType, to get counts.
            var t = r.GroupBy(x => x.HolterTestType);
            var tList = t.ToList();

            foreach(var u in tList)
            {
                var cc = new CompletedCount();
                var loc = LocationDao.FindById(r.Key);
                cc.Description = loc.Description;
                cc.RegionId = loc.Region.ID;
                cc.DivisionId = loc.Region.Division.ID;
                cc.TestTypeId = u.Key;
                cc.Count = u.Count();
                ccRpt.CompletedCounts.Add(cc);
            }
        }
于 2015-03-04T19:57:41.977 回答