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),
    });