嵌套Linq Group By

时间:2011-06-14 13:33:44

标签: c# .net linq group-by nested

我拥有:列表

类:规则     - >    类别:期限    --->    属性Compare_Src    属性Compare_Mode

我想做什么: 使用Linq语句获取我的规则,按其Compare_Src和Compare_Mode的组合分组。

一个组合的静态示例:(这里我得到所有规则的列表,其中Compare_src = EmpfaengerToken和Compare_mode = equals。我想要的是一个包含所有规则的完整列表,按两个属性分组,而不是硬编码值。< / p>

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

5 个答案:

答案 0 :(得分:3)

尝试这样的事情:

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

我在这里所做的(无论如何都试过,没有检查这是否真的适用于你的模型)是反向查询。首先获取所有术语,通过多个字段键对它们进行分组,然后为每个组选择相关规则。

答案 1 :(得分:2)

为什么单个群体不足够?您可以使用匿名类按多个术语分组:

var ruleGroups = from rule in rules 
                 group by new { rule.Term.Compare_src, rule.Term.Compare_mode } 
                 into g
                 select ...;

虽然你可以转换为列表列表,但是这会给你一个IGrouping,你可以使用SelectMany()来展平这个结构:

var orderedRuleList = ruleGroups.SelectMany( x => x)
                                .ToList();

答案 2 :(得分:0)

不要写只写代码。我知道对于lambdas和扩展方法来说,这种语法糖是很诱人的,但我建议将中间结果分配给临时持有者。

答案 3 :(得分:0)

您可以尝试

group term by new { term.Compare_src, term.Compare_mode }

答案 4 :(得分:0)

很难确切地知道你想要什么,因为这个例子并不那么清楚。你看过这两个资源了吗? MSDN101 Linq examples

如果您在问题中更准确,那么帮助您会更容易。