2013-09-27 2 views
2
내가 할 노력하고있어

을의 일부이고 부모 개체를 얻을 다음LINQ 쿼리 - 적어도 하나의 자식 엔터티 목록

class Account 
{ 
public virtual Ilist<Manager> Managers{get;set;} 
} 
class Manager 
{ 
public virtual Ilist<Account> Accounts{get;set;} 
} 

... 
private void Filter() 
{ 
// List of Accounts 
// Each Account has one or more Managers 
// Each Manager has one or more Accounts 

Ilist<Manager> FilteredManagers = new List<Manager>(); 
FilteredManagers .Add(new Manager(1)); 
FilteredManagers .Add(new Manager(2)); 
etc. 
//I tried something like 
var _Accounts = from a in Accounts 
       where FilteredManagers.Contains(a.Managers) 
       select a 
//but this didn't compile 

} 

내가 한 모든 계정을 반환 계정으로 쿼리를 실행하려면 더 많은 관리자 FilteredManagers에 또한 꽤 noobish 접근 내가 가정하지만 프로그래밍에 새로운 있습니다.

+0

방법 : FilteredManagers.Contains은 (a.Managers.Any은()) – iceheaven31

답변

3
var _Accounts = from a in Accounts 
       where 
        a.Managers.Any(p=>FilteredManagers.Contains(p)) // some of the managers in Filtered Managers 
       select a 
+0

이 적합한 솔루션으로 가리 보이지만 결과는 모든 계정을 반환해야하는 위치 filteredManagers 목록의 관리자가 적어도 한 명 이상 있습니다. – DanBaran

+0

@ user2822596 귀하의 의견에 따라 코드를 수정했습니다. – Alireza

+0

OK! 조금 더 아래로 나는 이걸 보았습니다 : 'var _Accounts = from a Account a.Managers.Any (m => FilteredManagers.Any (m1 => m1.ID == m.ID)) 선택하십시오; ' – DanBaran

0

귀하의 linq 코드는 지금까지 문제가 없습니다. 그러나 계정 및 관리자 클래스와 같은 참조 유형의 경우 기본 동등 비교는 참조 평등을 검사합니다. 즉, 주어진 linq 쿼리는 객체가 동일한 인스턴스 인 경우에만 올바르게 필터링됩니다.

등호 과부하를 구현해야합니다. 당신은 또한 수업에 ID 필드가 가정하면 당신은 당신의 AccountManager 클래스에서이 같은 작업을 수행 할 수 있습니다

public override bool Equals(System.Object obj) 
{ 
    if (obj == null) { return false; } 
    Account m = obj as Manager; 
    if ((System.Object)m == null) { return false; } 

    return (ID == m.ID); 
} 

public bool Equals(Manager m) 
{ 
    if ((object)m == null) { return false; } 
    return (ID == m.ID); 
} 

public override int GetHashCode() 
{  
    return ID.GetHashCode(); 
} 

이 그것 같은 인스턴스가 아닌 경우에도 동일한 계정 개체의 어떠했는지 LINQ 알 수 있습니다. 같음 오버로드에 대한 자세한 지침은

는()를 참조하십시오이 MSDN article

+0

하지만 두 목록을 비교하려고합니다. 재정의하면 이것이 작동하지 않습니다 ... – DanBaran