Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197

    c# cercare elementi in una collezione in base a valori di una collezione figlia

    ho bisogno di filtrare elementi di una List<T> sulla base di valri presenti in una collezione figlia della mi lista

    codice:
    List<Aziende> AllTree = LoadAziende()
    
    allTree = allTree.FindAll(x => x.Risorse.ToList().FindAll(r => r.Matricola == "xxx"));
    la classe "Aziende" ha una collezione figlia di tipo Icollection<Risorse>

    ho bisogno di tirare fuori solo quelle aziende "Aziende" che hanno una "risorsa" figlia che contenga un determinato valore - matricola="xxx"


    ottengo questo errore : Cannot implicit convert System.collection.generic.list<Risorsa> to bool

  2. #2
    Se vuoi ottenere tutte le aziende che contengano almeno una matricola con quel codice:
    codice:
    TuaLista.Where(x => x.Risorse.Any(r => r.Matricola == "XYZ"))
    Se invece vuoi ottenere le aziende dove tutte le risorse al suo interno hanno la matricola con codice:
    codice:
    TuaLista.Where(x => x.Risorse.All(r => r.Matricola == "XYZ"))

  3. #3
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197
    ok perfetto, cosi funziona alla grande, thanks

    se invece volessi filtrare le collezione figlia con solo i children che soddisfano il criterio

    r=>r.Risorse.matricola = "xxx"

    cioe se la collezione completa è:

    codice:
    Azienda
        |
         -------->risorsa(matricola=5555)
        |
         -------->risorsa(matricola=6666)
        |
         -------->risorsa(matricola=xxxx)
    
    
    
    io vorrei ottenere
    
    Azienda
        |
         -------->risorsa(matricola=xxxx)

  4. #4
    Beh in quel caso dovrai usare un Where nel padre ed un Contains nel figlio, qualcosa tipo questo:

    codice:
    TuaList.Where(x => x.Risorse.Where(r => r.Matricola == "ABC"))
    Se ti piace giocare con Linq ti consiglio questo indirizzo: ASP.NET e LinQ

  5. #5
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197
    cosi mi ritorna l'errore iniziale : Cannot implicit convert System.collection.generic.list<Risorsa> to bool

    anche giustamente aggiungio io perche la where interna ritorna una IEnumerable<Risorsa> mente la condizione da passare alla where (esterna) deve soddisfare un criterio vero/falso[r.Matricola == "xxx"]

  6. #6
    Allora puoi giocare con Any All Some ...

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    quella postata prima cosi dovrebbe andare:

    codice:
    TuaList.Where(x => x.Risorse.Where(r => r.Matricola == "ABC").Count() > 0)

  8. #8
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197
    Originariamente inviato da rsdpzed
    quella postata prima cosi dovrebbe andare:

    codice:
    TuaList.Where(x => x.Risorse.Where(r => r.Matricola == "ABC").Count() > 0)
    anche a me sembra la cosa piu sensata ma cosi non filtra la collezione figlia, prima di questa where la collezione "Risorse" ha 2 elementi (di cui una ha una matricola "ABC"),
    dopo la chiamata La collezione "Risorse" ha sempre 2 elementi

    mi viene da piangere c'e' qualche altra info che puo essere utile alla causa?

  9. #9
    Allora credo il tuo problema sia diverso da quel che chiedi.
    Con la sintassi Where, come in SQL, tu gli dici "Dammi parent e child dove child = ..." ma non ti filtra i children, per fare cio' devi fare qualcosa del genere:
    codice:
    var x = TuaLista.Where(g=>g.Risorse.Select(a=>a.Matricola == "ABC"));

  10. #10
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ho riletto meglio il post, effettivamente il problema è un po' piu complesso

    per mio personale esercizio ho cercato di risolvere la questione utilizzando solo linq, spero nel modo piu giusto:

    Il risultato finale è:
    A1
    --ABC
    A3
    --ABC
    --ABC

    esclude sia A2 che i singoli ordini in A1 che non siano ABC.

    ti ho messo qualche commento alla query linq
    codice:
                List<Azienda> aziende = new List<Azienda>
                {
                    new Azienda
                    { 
                        ID = "A1",
                        Ordini = new List<Ordine>
                        {
                            new Ordine { ID = "ABC" },
                            new Ordine { ID = "NO" }
                        }
                    },
                    new Azienda
                    { 
                        ID = "A2",
                        Ordini = new List<Ordine>
                        {
                            new Ordine { ID = "NO" },
                            new Ordine { ID = "NO" }
                        }
                    },
                    new Azienda
                    { 
                        ID = "A3",
                        Ordini = new List<Ordine>
                        {
                            new Ordine { ID = "ABC" },
                            new Ordine { ID = "ABC" }
                        }
                    }
                };
    
                var query = aziende
                    .SelectMany(a => a.Ordini.Where(o => o.ID == "ABC") //esclude le aziende che non hanno nemmeno un ordine ABC
                        .Select(o => new { az = a, or = o })) //seleziono in una nuova classe anonima per tenere traccia dell'azienda
                    .GroupBy(g => g.az) //raggruppo per azienda
                    .Select(s => new Azienda //ora riporto la collection di tipo IGrouping in una di tipo List<Azienda>
                    { 
                        ID = s.Key.ID, 
                        Ordini = s.Key.Ordini
                        .Where(o => o.ID == "ABC") // Ora per ogni azienda escludo anche gli ordini
                        .ToList()
                    })
                    .ToList();
    EDIT
    queste sono le due classi:
    codice:
    public class Ordine
            {
                public string ID { get; set; }
            }
            public class Azienda
            {
                public string ID { get; set; }
                public List<Ordine> Ordini { get; set; }
    
                public Azienda()
                {
                    Ordini = new List<Ordine>();
                }
            }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.