Question

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.

Was it helpful?

Solution

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

OTHER TIPS

Your linq code is fine so far. But for reference types such as your Account and Manager classes the default equality comparison checks for reference equality. This means the given linq query will only filter correctly if the objects are the very same instances.

You will need to implement your own Equals overload. Assuming you also have an ID field on your classes you can do something like this in your Account and Manager class:

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.

For detailed instructions on overloading Equals() see this MSDN article

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top