Linq GroupBy 和过滤器

问题描述 投票:0回答:1

我在警报和匹配表之间有父子一对多关系。我陷入了对子表属性应用过滤器的困境 以下是查询,场景是传入的整数列表。

var groupedQuery = 
    from a in _clientContext.Alerts
    join m in _clientContext.AlertsMatches
        on a.AlertID equals m.alertID
    group new { a, m } by new
    {
        a.AlertID,
        a.AlertDate,
        a.AlertScore,
    } into gr
    select new
    {
        AlertId = gr.Key.AlertID,
        AlertDate = gr.Key.AlertDate,
        AlertScore = gr.Key.AlertScore,
        ScenarioIds = gr.Select(x => x.m.Scenario.ScenarioId).ToList(),
    };

var query = 
    from item in groupedQuery
    select new AlertsDTO
    {
        AlertId = item.AlertId,
        AlertDate = item.AlertDate,
        ScenarioIds = ScenarioIds
    };

if (scenarios != null && scenarios.Length > 0)
            {
                // some condition to filter only alerts where some scenarioIds match
                query = query.Where(w => w.ScenarioIds.Any(id => id == 2));

                // another condition to filter only alerts where all scenarioIds match
               query = query.Where(w => w.ScenarioIds.All(id => id == 2));
            }

以下是各自的班级

public class AlertsDTO { 
    public int AlertId {get;set;}
    public DateTime AlertDate {get;set;}
    public string Scenario {get;set;}
}

public class Scenario { 
    public int ScenarioId {get;set;}
    public string ScenarioName {get;set;}
}

public class Alerts{
    public int AlertID {get;set;}
    public DateTime AlertDate {get;set;}
    public int AlertScore {get;set;}
}

public class AlertsMatches
{
    public int alertID { get; set;}
    public Scenario Scenario {get;set;}
    
}
c# linq entity-framework-core
1个回答
0
投票

您需要一个 SelectMany。见下文。我没有测试,所以可能需要一些小的改变

var groupedQuery = 
    (from a in _clientContext.Alerts
    join m in _clientContext.AlertsMatches on a.AlertID equals m.alertID
    select new {a = a, m = m }
    ).GroupBy(x => new { id = x.a.AlertID, date = x.a.AlertDate, score = x.a.Alert.Score})
    .Select(gr => new {
        AlertId = gr.Key.id,
        AlertDate = gr.Key.date,
        AlertScore = gr.Key.score,
        ScenarioIds = gr.SelectMany(x => x.Select(y => y.m.Scenario.ScenarioId)).ToList(),
    });
© www.soinside.com 2019 - 2024. All rights reserved.