代码之家  ›  专栏  ›  技术社区  ›  DanBaran

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

  •  2
  • DanBaran  · 技术社区  · 11 年前

    我正在努力做到以下几点:

    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运行查询,该查询返回具有一个或多个经理的所有Accounts,这些经理也在FilteredManagers中 我想这是一种很好的方法,但我对编程还很陌生。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Alireza    11 年前
    var _Accounts = from a in Accounts
                    where 
                         a.Managers.Any(p=>FilteredManagers.Contains(p)) // some of the managers in Filtered Managers
                    select a
    
        2
  •  0
  •   Marco    11 年前

    到目前为止,你的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