2012-11-22 69 views
3

條件名單上有兩個列表listA的是MyClassA與屬性的列表和數組listB的MyClassB獲取與子列表

MyClassA

  • 編號
  • 名稱

MyClassB有屬性:

  • 編號
  • 名稱
  • 活動
  • MyClassAId

的項目MyClassA可以有一個或多個項目MyClassB

- MyClassA 
    | 
    | MyClassB 
    | MyClassB 
- MyClassA 
    | 
    | MyClassB 
    | MyClassB 
    | MyClassB 
    | MyClassB 

我想要得到的MyClassA,其中一個列表件數MyClassBactive = true> 1

我想是這樣的:

listA.Where(b => listB.Any(a => a.MyClassAId == b.Id && a.Active == true)); 

回答

2

Any會> 0> 1,你可以這樣做:對LINQ

listA.Where(a => listB.Count(b => b.MyClassAId == a.Id && b.Active) > 1); 

或具有更好的短路(但probabably罰款-to-對象,但不是EF等):

listA.Where(
    a => listB.Where(b => b.MyClassAId == a.Id && b.Active).Skip(1).Any()); 

另一種方法是預先計算的計數:

var include = new HashSet<int>(listB.Where(b => b.Active) 
        .GroupBy(b => b.MyClassAId) 
        .Where(grp => grp.Count() > 1) 
        .Select(grp => grp.Key)); 

然後:

listA.Where(a => include.Contains(a.Id)); 
0
var query = (from a in listA let count = listB.Count(b => b.Active && a.Id == b.MyClassAId) where count > 1 select a).ToList();