使用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都放在一个列表中。

使用linq对实体进行多对多查询的问题

首先,让我试着把名字取对。这不是一个纯粹的多对多关联,因为连接类是类模型的一部分。这就是我非正式地称之为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));