linq query - 获取父实体,其中至少有一个子实体是列表的一部分

时间:2013-09-27 08:27:14

标签: c# linq entity-framework select ilist

我正在尝试执行以下操作:

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

}

我想在Accounts上运行查询,该查询返回所有包含一个或多个Managers的帐户,这些Managers也在FilteredManagers中 我认为这是一种非常无趣的方法,但我对编程很陌生。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

到目前为止你的linq代码很好。但是对于诸如Account和Manager类之类的引用类型,默认的相等性比较会检查引用相等性。这意味着只有当对象是完全相同的实例时,给定的linq查询才会正确过滤。

您需要实现自己的Equals重载。假设您的课程上还有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知道它是同一个Account对象,即使它不是同一个实例。

有关重载Equals()的详细说明,请参阅此MSDN article