我在警报和匹配表之间有父子一对多关系。我陷入了对子表属性应用过滤器的困境 以下是查询,场景是传入的整数列表。
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;}
}
您需要一个 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(),
});