2012-07-27 2 views
1

J'ai ces classes:Puis-je utiliser LINQ pour rechercher une liste interne dans une liste de listes?

public class ZoneMember 
    // a zone member is a member of a zone 
    // zonemembers have ports, WWPNs, aliases or all 3 
{ 
    private string _Alias = string.Empty; 
    public string MemberAlias {get{return _Alias;} set{_Alias = value; } } 
    private FCPort _Port = null; 
    public FCPort MemberPort { get { return _Port; } set { _Port = value; } } 
    private string _WWPN = string.Empty; 
    public string MemberWWPN { get { return _WWPN; } set { _WWPN = value; } } 
    private bool _IsLoggedIn; 
    public bool IsLoggedIn { get { return _IsLoggedIn; } set { _IsLoggedIn = value; } } 
    private string _FCID; 
    public string FCID {get{return _FCID;} set{ _FCID=value; } } 
} 

public class Zone 
{ 
    public List<ZoneMember> MembersList = new List<ZoneMember>(); 
    private string _ZoneName; 
    public string zoneName{ get{return _ZoneName;} set{_ZoneName=value;} } 

    public Zone(string n) { zoneName=n; } 

}

public class ZoneSet 
{  
    private string _ZoneSetName; 
    private int _VSANNum; 
    public string ZoneSetName{get{ return _ZoneSetName;} set{_ZoneSetName=value;} } 
    public int VSANNum{ get{ return _VSANNum;} set{_VSANNum=value;} } 
    public bool isActive; 
    public List<Zone> ZoneList = new List<Zone>(); 
} 

Je veux trouver toutes les zones dans un Zoneset qui ont un membre de la zone avec une valeur spécifique pour une propriété dans le Les Membres de la.

Je sais que quelque chose comme cela fonctionnera - dans ce cas, je suis à la recherche sur la propriété WWPN:

// assumes myZoneSet has already been instantiated ad has zones in it 
// and inputWWPN in the select statement has the value we want 

List<Zone> myZoneList = new List<Zone>(); 

foreach (Zone z in myZoneset) 
{ 
var zm=null; 

     zm = from member in z.MembersList where member.MemberWWPN == inputWWPN select member; 
    // if we find a matching member, add this zone to the list 
    if (zm != null) 
    { myZoneList.Add(z); 
    } 
} 

Y at-il un moyen d'utiliser LINQ pour faire la chose entière? Je ne suis pas sûr de ce que la terminologie serait en termes de base de données.

Répondre

0

Essayez ceci -

List<Zone> listOfZone = zoneSet.ZoneList.Where(e => e.Any(p => p.MemberWWPN == inputWWPN)).ToList(); 
+0

Ne fonctionne pas, 'e' ne peut pas être défini dans les lambda externe et interne. – Nuffin

+0

hummm ... à droite – atiyar

+0

que diriez-vous? :) – atiyar

3

Cette petite requête doit être tout ce dont vous avez besoin:

var myZoneList = myZoneSet.ZoneList 
    .Where(z => z.Any(member => member.MemberWWPN == inputWWPN)) 
    .ToList(); 
+0

merci, je vais tester cela dans les prochains jours. Si ça marche, j'ai un autre code à refactoriser et je pense pouvoir l'utiliser. –

0
myZoneList =myZoneSet.SelectMany(z => z.MembersList).Where(m => m.MemberWWPN == "somestring").ToList(); 

J'espère que cela vous aidera.

Questions connexes