我正在尝试执行以下操作:
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中 我认为这是一种非常无趣的方法,但我对编程很陌生。
答案 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字段,您可以在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 article