我拥有:列表
类:规则 - > 类别:期限 ---> 属性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;
.........
}
答案 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)
很难确切地知道你想要什么,因为这个例子并不那么清楚。你看过这两个资源了吗? MSDN和101 Linq examples。
如果您在问题中更准确,那么帮助您会更容易。