嵌套Linq Group By

问题描述

| 我拥有的:清单 类别:规则    ->    类别:学期    ->    属性Compare_Src    属性Compare_Mode 我想做的事: 使用Linq语句获取我的规则,并按其Compare_Src和Compare_Mode的组合进行分组。 一个组合的静态示例:(在这里,我得到了Compare_src = EmpfaengerToken和Compare_mode = equals的所有规则的列表。我想要的是一个包含所有规则的完整列表,该列表按两个属性分组,而不是硬编码值。
            var regeln_empfaengertoken  = 
        (
            from rule in rules 
            where 
            (
                from term in rule.Term 
                    where 
                    (
                        term.Compare_src == Entities.Enums.Compare_src.EmpfaengerToken
                        &&
                        term.Compare_mode.ToString() == \"equals\"
                    )
                    select term
            ).Count() > 0 
            select rule
        ).ToList<Entities.Rule>();
我知道这是可能的,但找不到正确的解决方案:(
  [Serializable]
public class Rule
{
    private List<Term> _term = new List<Term>();
    ...
}


   [Serializable]
public class Term
{
    private Entities.Enums.Compare_src _compare_src;
    private Entities.Enums.Compare_mode _compare_mode;
    private Entities.Enums.Compare_Type _compare_type;
    .........
 }
    

解决方法

        尝试这样的事情:
rules.SelectMany(rule => rule.Term)
     .GroupBy(term => new { term.Compare_src,term.Compare_mode })
     .Select(termGroup => 
           new {
              Key = termGroup.key,Rules = rules.Where(r => r.Term.Any(t => 
                 t.Compare_src == termGroup.key.Compare_src && 
                 t.Compare_mode == termGroup.key.Compare_mode
              )
               }
             )
我在这里所做的(无论如何都尝试过,没有检查它是否确实适用于您的模型)是对查询求逆。首先获取所有术语,通过多个字段键将它们分组,然后为每个组选择相关规则。     ,        为什么一个组不够用呢?您可以使用匿名类按多个术语进行分组:
var ruleGroups = from rule in rules 
                 group by new { rule.Term.Compare_src,rule.Term.Compare_mode } 
                 into g
                 select ...;
这可以给您一个ѭ4give,虽然您可以将其转换为列表列表,但是可以使用
SelectMany()
展平此结构:
var orderedRuleList = ruleGroups.SelectMany( x => x)
                                .ToList();
    ,        不要编写只写代码。我知道在lambda和扩展方法上使用这种语法糖很诱人,但是我建议将中间结果分配给临时持有者。     ,        你可以试试
group term by new { term.Compare_src,term.Compare_mode }
    ,        很难确切地知道您想要什么,因为该示例不太清楚。您是否看过这两种资源? MSDN和101 Linq示例。 如果您的问题更精确,则可以为您提供帮助。