简体   繁体   English

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

[英]linq query - get parent entity where at least one child entity is part of list

I'm trying to do the following: 我正在尝试执行以下操作:

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

}

I want to run a query over Accounts which returns all Accounts with one or more Managers which are also in FilteredManagers Quite a noobish approach i suppose but I'm pretty new to programming. 我想对帐户运行查询,该查询返回具有一个或多个Managers的所有Accounts,这些Managers也位于FilteredManagers中。我认为这是一种很笨拙的方法,但是对于编程我还是很陌生。

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

Your linq code is fine so far. 到目前为止,您的linq代码还可以。 But for reference types such as your Account and Manager classes the default equality comparison checks for reference equality. 但是对于诸如您的Account和Manager类之类的引用类型,默认的相等性比较会检查引用的相等性。 This means the given linq query will only filter correctly if the objects are the very same instances. 这意味着仅当对象是完全相同的实例时,给定的linq查询才会正确过滤。

You will need to implement your own Equals overload. 您将需要实现自己的Equals重载。 Assuming you also have an ID field on your classes you can do something like this in your Account and Manager class: 假设您的课程中也有一个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();
}

This will allow LINQ to know wether it's the same Account object even if it's not the same instance. 即使它不是同一实例,这也将使LINQ知道它是同一Account对象。

For detailed instructions on overloading Equals() see this MSDN article 有关重载Equals()的详细说明,请参阅此MSDN文章。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM