我有一张桌子
应用
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列入一个列表。
答案 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));