2

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

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 的 Accounts,这些 Managers 也在 FilteredManagers 中我想这是一种相当愚蠢的方法,但我对编程很陌生。

4

2 回答 2

3
var _Accounts = from a in Accounts
                where 
                     a.Managers.Any(p=>FilteredManagers.Contains(p)) // some of the managers in Filtered Managers
                select a
于 2013-09-27T08:30:15.557 回答
0

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

您将需要实现自己的 Equals 重载。假设您的课程中还有一个 ID 字段,您可以在您的课程中执行以下Account操作Manager

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 文章

于 2013-09-27T08:48:22.660 回答