问题描述
|
我拥有的:清单
类别:规则
->
类别:学期
->
属性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示例。
如果您的问题更精确,则可以为您提供帮助。