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

时间:2015-11-27 04:14:59

标签: c# entity-framework linq-to-entities

我有一张桌子

应用

ApplicationID,
NAme

ApplicationSteps

AplicationStepID,
AplicationID,
StepID

ApplicationStepCriterias

ApplicationStepID,
CriteriaID

所以我有一个SelectedCriteriaID - 用户从下拉列表中选择一个标准,他希望表SelectedCriteriaID中有ApplicationStepCriterias的所有应用程序

我试过

 var ds = context.Applications
                   .Where(a => a.ApplicationSteps
                                  .Select(x=>x.ApplicationStepCriterias
                                                 .Select(t=>t.CriteriaId))
                                  .Contains(SelectesdCriteria));

但是因为我有结果IEnumerable<IEnumerable<int>>我不能使用包含 我只获得每个CriteriaId的所有ApplicationStep列表(也是序列)。我想不出方法可以将所有CriteriId s列入一个列表。

2 个答案:

答案 0 :(得分:2)

首先,让我试着让名字正确。这不是纯粹的多对多关联,因为联结类是类模型的一部分。这是我非正式地称之为 1-n-1 的关联。你有

Application -< ApplicationSteps >- ApplicationStepCriterias

我强烈建议您为班级使用单数名称......

Application -< ApplicationStep >- ApplicationStepCriterion

...所以你可以使用复数来收集属性名称而不会混淆。

如果我到目前为止,您的查询应该是

context.Applications
       .Where(a => a.ApplicationSteps
                    .Any(x => selectedCriteria
                              .Contains(x.ApplicationStepCriterion.CriteriaId));

(我也更喜欢 CriterionId ,可能指的是 Criterion 类)

答案 1 :(得分:0)

您可以尝试这样的事情:

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