【问题标题】:linq query - get parent entity where at least one child entity is part of listlinq 查询 - 获取至少一个子实体是列表一部分的父实体
【发布时间】:2013-10-03 11:31:00
【问题描述】:

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

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

【问题讨论】:

  • 怎么样:FilteredManagers.Contains(a.Managers.Any())

标签: c# linq entity-framework select ilist


【解决方案1】:
var _Accounts = from a in Accounts
                where 
                     a.Managers.Any(p=>FilteredManagers.Contains(p)) // some of the managers in Filtered Managers
                select a

【讨论】:

  • 这似乎指向了正确的解决方案,但结果应该返回所有帐户,这些帐户至少有一个(或多个)过滤管理器列表中的管理器。
  • 好的!再往前走一点,我遇到了这个:var _Accounts = from a in Accounts where a.Managers.Any(m =&gt; FilteredManagers.Any(m1 =&gt; m1.ID == m.ID)) select a;
【解决方案2】:

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

您需要实现自己的 Equals 重载。假设您的课程中还有一个 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 article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2010-10-26
    • 2017-09-27
    相关资源
    最近更新 更多