Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq查询-获取父实体,其中至少有一个子实体是列表的一部分_C#_Linq_Entity Framework_Select_Ilist - Fatal编程技术网

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

C# linq查询-获取父实体,其中至少有一个子实体是列表的一部分,c#,linq,entity-framework,select,ilist,C#,Linq,Entity Framework,Select,Ilist,我正在努力做到以下几点: 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 /

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

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

}
类帐户
{
公共虚拟Ilist管理器{get;set;}
}
班级经理
{
公共虚拟Ilist帐户{get;set;}
}
...
专用空过滤器()
{
//帐户清单
//每个帐户都有一个或多个经理
//每个经理都有一个或多个帐户
Ilist FilteredManager=新列表();
添加(新经理(1));
添加(新经理(2));
等
//我试过类似的东西
var_Accounts=来自账户中的
其中FilteredManagers.Contains(a.Managers)
选择一个
//但这并没有编译
}
我想对帐户运行一个查询,该查询返回一个或多个经理的所有帐户,这些经理也在FilteredManager中
我想这是一种非常不明智的方法,但我对编程非常陌生。

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

var _Accounts = from a in Accounts
                where 
                     a.Managers.Any(p=>FilteredManagers.Contains(p)) // some of the managers in Filtered Managers
                select a
您需要实现自己的Equals重载。假设您的类中也有一个ID字段,您可以在
帐户
管理器
类中执行类似操作:

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()的详细说明,请参见此

如何:where FilteredManagers.Contains(a.Managers.Any())这似乎指向正确的解决方案,但结果应返回至少有一个(或多个)FilteredManagers列表中的管理器的所有帐户。确定!再往前走一点,我遇到了这样一个问题:
var\u Accounts=来自a的in Accounts,其中a.Managers.Any(m=>FilteredManagers.Any(m1=>m1.ID==m.ID))选择a