2013-09-27 37 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 我認爲這是一種很不錯的方式,但我對編程相當陌生。

+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

行!我碰到了這一點: 'var _Accounts = from a Accounts where a.Managers.Any(m => FilteredManagers.Any(m1 => m1.ID == m.ID)) 選擇一個;' – DanBaran

0

您的linq代碼到目前爲止還不錯。但對於參考類型,例如您的Account和Manager類,默認的相等比較檢查參考相等性。這意味着如果對象是完全相同的實例,給定的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知道羯羊它,即使它是不一樣的情況下相同的帳戶對象。

有關超載的Equals詳細說明()看到這個MSDN article

+0

但我想比較兩個列表。隨着你的覆寫這不起作用... – DanBaran