使用linq对实体进行多对多查询的问题
本文关键字:查询 问题 linq 实体 使用 | 更新日期: 2023-09-27 18:24:35
我有一个表
应用程序
ApplicationID,
NAme
应用程序步骤
AplicationStepID,
AplicationID,
StepID
应用程序步骤标准
ApplicationStepID,
CriteriaID
所以我有一个SelectedCriteriaID
——一个用户从下拉列表中选择一个标准,他想要所有在表ApplicationStepCriterias
中有这个SelectedCriteriaID
的应用程序
我试过
var ds = context.Applications
.Where(a => a.ApplicationSteps
.Select(x=>x.ApplicationStepCriterias
.Select(t=>t.CriteriaId))
.Contains(SelectesdCriteria));
但由于我的结果是IEnumerable<IEnumerable<int>>
,我不能使用Contains我只得到每个ApplicationStep
的所有CriteriaId
的列表(也是一个序列)。只是我想不出办法把所有的CriteriId
s都放在一个列表中。
首先,让我试着把名字取对。这不是一个纯粹的多对多关联,因为连接类是类模型的一部分。这就是我非正式地称之为1-n-1的关联。所以你有
Application -< ApplicationSteps >- ApplicationStepCriterias
我强烈建议你的课程使用单数名称。。。
Application -< ApplicationStep >- ApplicationStepCriterion
因此,您可以使用复数形式表示集合属性名称,而不会混淆。
如果到目前为止我是对的,您的查询应该是
context.Applications
.Where(a => a.ApplicationSteps
.Any(x => selectedCriteria
.Contains(x.ApplicationStepCriterion.CriteriaId));
(我也更喜欢CriterionId,可能指的是Criterion类)
您可以尝试以下操作:
var applicationStepIds = context.ApplicationStepCriterias
.Where(i => i.CriteriaID == selectedCriteria)
.Select(i => i.ApplicationStepID)
.Distinct();
var applicationIds = context.ApplicationSteps
.Where(i => applicationStepIds.Contains(i.AplicationStepID))
.Select(i => i.AplicationID)
.Distinct();
var result = context.Applications.Where(i => applicationIds.Contains(i.ApplicationId));