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

本文关键字:实体 有一个 一部分 列表 查询 获取 LINQ | 更新日期: 2023-09-27 18:32:56

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

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
}

我想对帐户运行查询,该查询返回具有一个或多个经理的所有帐户,这些经理也在筛选经理中我想这是一种相当菜鸟的方法,但我对编程很陌生。

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

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

,您的 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 知道它是否是同一个 Account 对象,即使它不是同一个实例。

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

相关文章: