Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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# linq中的可选随机顺序嵌套分组_C#_Linq - Fatal编程技术网

C# linq中的可选随机顺序嵌套分组

C# linq中的可选随机顺序嵌套分组,c#,linq,C#,Linq,我真的处于一个我想不出关于linq中可选分组的答案的位置 基本上,我想从一个有过滤器的屏幕生成报告。 这些过滤器(大部分是分组的)是可选的,可以重新排列 Filters: 1.Clients Projects Tasks Duration or 2.Projects Clients Tasks Duration or 3.Task Duration etc. 所有可能的组合。 那么数据应该

我真的处于一个我想不出关于linq中可选分组的答案的位置

基本上,我想从一个有过滤器的屏幕生成报告。 这些过滤器(大部分是分组的)是可选的,可以重新排列

Filters: 1.Clients Projects Tasks Duration
                or 
         2.Projects Clients  Tasks Duration
                or 
         3.Task Duration etc.
所有可能的组合。 那么数据应该是这样的

1.ClientA
     ProjectA
        TaskA
             26hrs 45mins
        TaskB
             43hrs 23mins
    ProjectB
      TaskX......
2.ProjectA
    ClientA
       TaskA
             26hrs 45mins...

3.TaskA
      26hrs 45mins
  TaskB
     6hrs 35mins
我有数据,但无法写出广义的逻辑

我正在考虑使用一些枚举来保存所选的过滤器(viewmodel),如 枚举.客户端,枚举.项目。。。和

 if (clientGroupChecked) then 
     foreach(var clientGroup in list){
        //group list by client here
     if(projectGroupChecked) then
        foreach(var projectGroup in clientGroup){
        //group list by project here
}
}
我知道,这是错误的。这样我就必须为所有可能的组合设置逻辑 我想不出其他任何东西。我真的希望它是通用的,因为它将来可能会添加更多的过滤器,我不想为了额外的过滤器而改变整个逻辑(当然,我想在逻辑中的某个地方添加新的过滤器组。但我希望它也更易于维护

已编辑:
@sschimmel:我的观点是分组可以乱序(为此,我有按钮[选中的-->绿色和未选中的-->灰色,这些按钮可以移动以进行分组]因此,在编写linq逻辑时,我如何才能知道我必须以特定的方式对哪些标准进行分组呢?
对于ex:我有A、B、C、D、E、F列。在这方面,我可以选择按A、B、B、A或ACB……等进行分组。使用所有可能的组合。如何实现这一点?我不想检查,因为我们有e许多可能性。如果添加一个多个过滤器,它将有许多多个可能性。这就是为什么我认为需要一般方法来做这件事

编辑2

请在下面找到附件和我是如何尝试的

    //for the following ,I need some way of writing properly passing right values
    var reportGroupingCP = (from t in TaskEntries
                          group t by new { clientId,projectId  } into g
                          select new 
                          {
                              ClientId = g.Key.clientId,
                              ProjectId = g.Key.projectId,
                             Result = (Type)g //What could be T
                          }).ToList();



   var reportGroupingCE = (from t in  TaskEntries
                          group t by new { clientId,employeeId } into g
                          select new 
                          {
                              ClientId = g.Key.clientId,
                              EmployeeId = g.Key.employeeId,
                              Result = (Type)g //What could be T
                          }).ToList();
    //Can't use above if there is filter only for client.similarly for other cases/I don't want to write for each one.I need way to do this dynamically.May be by passing enum or adding ids to some class or something else


如果我正确理解了您的问题,您就不必在多个属性上动态分组数据

最简单的解决方案是使用它,它允许您从字符串创建查询,您可以轻松地从用户输入合成字符串

// userSelections is created dynamically from what the user selected.
var userSelections = new[] { "clientId", "projectId" };
var propertiesToGroupBy = string.Join(", ", userSelections);
var groupedData  = data.GroupBy("new(" + propertiesToGroupBy + ")");
它既不是类型安全的,也不是在编译时检查的,但是它相当容易使用,并且解决了您的问题


我试图想出一个动态组合
表达式
s的解决方案,但在创建
表达式
时遇到了困难,该表达式表示将在
GroupBy(new{…})中使用的匿名类型
。由于要分组的选定属性的数量在编译时是未知的,因此无法创建匿名类型。

输入模型是什么样子的?输出应该是什么样子的?您将如何使用输出?可能我遗漏了什么,但您似乎可以构造您需要的查询基于所选的筛选器,然后将结果数据绑定到控件(如GridView)以进行显示。是否尝试执行我没有看到的其他操作?使用动态Linq()可能会对查询端有所帮助,即将筛选器与基于字符串的筛选器表达式相关联,允许您添加筛选器,而无需触及代码的实际查询部分。这个问题非常不清楚。能否以C#代码提供示例源数据?能否提供一些筛选该数据的示例?@Enigmativity:我正在尽我所能解决问题in简单的场景。我不知道如何针对我的情况编写linq。我真的被卡住了。我将尝试再次解释。例如,我有过滤器A、B、C(在编辑的问题中解释)但这些过滤器是可选的,当分组意味着我可以按A、B、C或B、A、C或C、A、B或只是A或只是B等进行分组时,顺序非常重要。这里我有3列,所以可能的分组方式是2^3=8。分组是按顺序排列的基于动态的过滤器。请查找有问题的结构。提到的1…2…是显示的场景我的数据。所以,我不能完全使用它。但您告诉我,这样做只能通过动态linq。我是否应该使用表达式和lambda与动态linq一起工作,以便使用更少的魔法字符串进行写入(完全不喜欢,因为我只为group by传递GUID类型)?.即使我尝试编写一些函数,我也怀疑我是否能够用这种方法进行迭代和动态显示(你怎么说)[我的意思是如果有四个组,那会怎么样。在这种情况下,我需要更多地使用嵌套foreach。]请告诉我下面的行是否有助于您继续前进。我尝试了,但没有得到任何结果。data.GroupBy(“new”(“+propertiesToGroupBy+”),“it”);这可能有助于您进一步帮助我