C# 我将如何编写这个LINQ查询
以下是我想做的: 我有一套唱片。这些记录是按年份排序的C# 我将如何编写这个LINQ查询,c#,linq,C#,Linq,以下是我想做的: 我有一套唱片。这些记录是按年份排序的 Record { string Name {get;set;}, int Year {get;set;} //some other properties } 我有一套针对每条记录的规则。每个规则都有一个类型和一个条件 Rule { RuleType Type {get;set;}, Func<Record,bool> Condition {get;set;} } 在LINQ中,我正在努力正确地组合笛卡尔连
Record
{
string Name {get;set;},
int Year {get;set;}
//some other properties
}
我有一套针对每条记录的规则。每个规则都有一个类型和一个条件
Rule
{
RuleType Type {get;set;},
Func<Record,bool> Condition {get;set;}
}
在LINQ中,我正在努力正确地组合笛卡尔连接+单个where条件+第一次出现+一个分组
请帮忙
谢谢。您可以使用双
from
以linq查询语法进行笛卡尔乘积,如下所示:
var query= from r in Records
from rule in Rules
where rule.Condition(r)
group new {rule.Type, r.Year } by rule.Type into g
select g.OrderBy(e=>e.Year).FirstOrDefault();
所以你有两个序列。一系列记录和一系列规则:
IEnumerable<Record> records = ...
IEnumerable<Rule> rules = ...
从规则集合中的每个规则中,选择与规则匹配的规则和记录集合的第一条记录,并将它们放在一个匿名对象中,该匿名对象具有属性rule和FirstMachingRecord
请注意,每个第一个匹配的记录都是按照记录集合的顺序排列的。SQL语句建议您按升序年对记录进行排序:
IEnumerable<Record> result = Rules.Select(rule =>
records.Where(record => rule.Condition(record))
.OrderBy(record => record.Year)
.FirstOrDefault();
对于规则集合中的每个规则,创建一个新的匿名对象,该对象包含该规则以及与该规则匹配的记录序列(按年份升序排列)。从这个结果来看,
记录
和规则
之间有什么联系?您能提供一个示例列表吗?最好能显示示例信息和示例结果。是否希望每组第一次出现?您的意思是rule.Type
,而不是r.Type
。
IEnumerable<Record> records = ...
IEnumerable<Rule> rules = ...
IEnumerable<Record> result = Rules.Select(rule =>
records.Where(record => rule.Condition(record))
.FirstOrDefault();
var result = rules.Select(rule => new
{
Rule = rule,
FirstMatchingRecord = records
.Where(record =>rule.Condition(record))
.FirstOrDefault(),
});
IEnumerable<Record> result = Rules.Select(rule =>
records.Where(record => rule.Condition(record))
.OrderBy(record => record.Year)
.FirstOrDefault();
var orderedRecords = records.Orderby(record => record.Year);
IEnumerable<Record> result = Rules.Select(rule =>
orderedRecords.Where(record=> rule.Condition(record))
.FirstOrDefault();
var result = rules.Select(rule => new
{
Rule = rule,
MatchingRecords = records
.Where(record => rule.Condition(record))
.OrderBy(record => record.Year),
});