嵌套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;
.........
}
试试这样的东西:
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示例。
如果你的问题更准确,那么帮助你会更容易。