2015-11-27 122 views
0

我有一个表问题与许多一对多使用LINQ到实体查询

应用

ApplicationID, 
NAme 

ApplicationSteps

AplicationStepID, 
AplicationID, 
StepID 

ApplicationStepCriterias

ApplicationStepID, 
CriteriaID 

所以我有一个SelectedCriteriaID - 用户从下拉列表中选择一个标准,他希望所有有这个SelectedCriteriaIDApplicationStepCriterias

我试图

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。

+0

'。凡(等等).ToList()。包含'或者只是把你的SelectesdCriteria放在哪里。 'where(x => x.ApplicationStepCriterias.Select(t => t.CriteriaId)&SelectesdCriteria)' – teynon

+1

'context.Applications.Where(a => a.ApplicationSteps.Any(as => as.ApplicationStepCriterias.Any(asc => asc.CriteriaID == SelectedCriteriaID)))' –

回答

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

首先,让我尝试获得名称权。这不是纯多对多关联,因为结类是类模型的一部分。这是我非正式地称为1-n-1关联。所以,你必须

Application -<ApplicationSteps>- ApplicationStepCriterias 

我强烈建议使用奇异的名字为你的类...

Application -<ApplicationStep>- ApplicationStepCriterion 

...所以你可以使用复数的集合属性的名称,而不感到困惑。

如果我是正确的,到目前为止,你应该为查询

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

(我也宁愿CriterionId,大概指的是标准类)