嵌套Linq分组依据

本文关键字:Linq 嵌套 | 更新日期: 2023-09-27 17:59:18

我有什么:列出

类别:规则-->类别:学期--->属性Compare_Src属性比较模式

我想做的事:使用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;
    .........
 }

嵌套Linq分组依据

试试这样的东西:

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

这将给你一个IGrouping,尽管你可以转换为列表列表,你可以使用SelectMany():来压平这个结构

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

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

您可以尝试

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

由于示例不太清楚,很难确切知道您想要什么。你看过这两种资源吗?MSDN和101 Linq示例。

如果你的问题更准确,那么帮助你会更容易。