Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda Linq Iqueryable组-添加另一个组_C#_Linq_Lambda_Iqueryable_Linq Group - Fatal编程技术网

C# Lambda Linq Iqueryable组-添加另一个组

C# Lambda Linq Iqueryable组-添加另一个组,c#,linq,lambda,iqueryable,linq-group,C#,Linq,Lambda,Iqueryable,Linq Group,我有一种方法,用于根据用户在选择列表中选择的选项生成摘要报告,以统计在日期范围内某个区域(含子集位置)完成的测试类型的数量 以下是数据的样子: 按位置完成的测试计数 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 H

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

以下是数据的样子: 按位置完成的测试计数 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中,向GROUPBY添加另一个属性)。在我的
testTypeId
选择列表中,我使用0作为我的“全部”项。在一个完美的世界中,如果
testTypeId==0
,我会在
IQueryable
中添加另一个方法,这样我就可以保留相同的私有方法,而不是编写新的查询

以下是我们希望数据在“所有”情况下的外观:

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
下面的示例显示了我想要添加的内容,但语法告诉我不能将包含
I分组的
IQueryable
转换为目标类型
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;
}
private CompletedCountReport GetCompletedCountsByRegion(int regionId,DateTime?startDate,DateTime?endDate,int testTypeId)
{
var ccRpt=new CompletedCountReport{CompletedCounts=new List(),StartDate=StartDate,EndDate=EndDate,SelectedRegionID=regionId};
var query=HolterTestDao.FindAll(新的getCompletedByRegionidDates(regionId,startDate.Value,endDate.Value));
//选择了特定的测试类型
如果(testTypeId>0)
{
query=query.Where(x=>x.HolterTestType==testTypeId);
}
//这就是我想要添加的->否则按测试类型分组x.HolterTestType);
}
//按区域内的locationID订购。
query=query.OrderBy(x=>x.Location.ID);
var htList=query.ToList();
//现在按位置分组,以获取计数。
var reportContents=htList.GroupBy(x=>x.Location.ID);
foreach(reportContents中的var)
{
var rList=r.ToList();
var cc=新的CompletedCount();
var loc=LocationDao.FindById(r.Key);
cc.说明=位置说明;
cc.RegionId=loc.Region.ID;
cc.Division ID=loc.Region.Division.ID;
cc.TestTypeId=TestTypeId;
cc.Count=rList.Count;
ccRpt.CompletedCounts.Add(cc);
}
返回ccRpt;
}

我的解决方案是按位置和HolterTestType排序,然后按位置分组基本内容,然后通过结果在我的循环中添加另一个分组,以按测试类型获得计数:

        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);
            }
        }

为什么要有条件地对数据进行分组?只需无条件地对数据进行分组。那么您的意思是始终按位置和测试类型分组?有时他们只想看到一种测试类型的数字,有时他们想看到所有的测试类型types@JenniferS您仍然可以有条件地筛选数据,只是不要有条件地对数据分组。总是分组,然后选择性地过滤(或相反)。我不明白。当“所有”结果都是按位置分组的多个测试类型时,按测试类型分组有什么意义?您也可以完全跳过按测试类型分组。我被您的问题弄糊涂了,因为您的“所有”数据示例根本没有按测试类型分组(它只是按位置排序/分组),我认为这是您尝试但无法做到的。如果您的目标只是获得一个列表,其中所有数据按位置分组,每个位置按测试类型分组,那么我认为您可以简单地使用
OrderBy(x=>x.location.ID)。然后使用
IQueryable
上的by(x=>x.HolterTestType)
,并大大简化您的代码。