10 messaggi dal 10 marzo 2010
Buongiorno ho una classe così definita

public class Materiale
{
    public string IdMateriale { get; set; }
    public string GenereMateriale { get; set; }
    public string Categoria { get; set; }
    public string Modello { get; set; }
    public string Tipo { get; set; }
    public string NumSerie { get; set; }
    public int Anno { get; set; }
    public string DittaCostruttrice { get; set; }
    public string Note { get; set; }
    public List<Controllo> Controlli = new List<Controllo>();
    public List<MezzoAssegnato> MezziAssegnati = new List<MezzoAssegnato>();
    public List<SedeAssegnata> SediAssegnate = new List<SedeAssegnata>();
}

public class Controllo
{
    public string IdControllo { get; set; }
    public DateTime DataControllo { get; set; }
    public string IdMateriale { get; set; }
    public string Utente { get; set; }
    public string Stato { get; set; }
    public string Note { get; set; }
}

public class MezzoAssegnato
{
    public string IdAssegnazione { get; set; }
    public string IdMateriale { get; set; }
    public string Targa { get; set; }
    public DateTime AssegnatoDal { get; set; }
    public DateTime AssegnatoAl { get; set; }
}

public class SedeAssegnata
{
    public string IdAssegnazione { get; set; }
    public string IdMateriale { get; set; }
    public string IdSede { get; set; }
    public string Comando { get; set; }
    public DateTime AssegnatoDal { get; set; }
    public DateTime AssegnatoAl { get; set; }
}


volendo eseguire una query su una lista di tipo "Materiale"

    List<Materiale> m = new List<Materiale>();


filtrando le proprietà "Controlli", "MezziAssegnati" e "SediAssegnate" in modo che mi venga restituito l'oggetto con il controllo più recente, l'assegnazione di mezzo più recente e l'assegnazione di sede più recente; ho provato in questo modo.

List<Materiale> m2 = (from ma in m
                              from c in ma.Controlli
                              where c.DataControllo == Max(c.DataControllo)
                              from sa in ma.SediAssegnate
                              where sa.AssegnatoAl == Max(sa.AssegnatoAl)
                              from mas in ma.MezziAssegnati
                              where mas.AssegnatoAl == Max(mas.AssegnatoAl)
                              select new
                              {
                                  ma, c.Stato, sa.Comando, sa.IdSede, mas.Targa
                              }).ToList();


Però mi da errore già sul primo Max (Max non esiste nel contesto corrente)

Qualcuno può aiutarmi?
Modificato da pigeonit il 06 ottobre 2015 15.09 -
10 messaggi dal 10 marzo 2010
Risolto così:


var m2 = (from ma in m
                 let controlloRecente = ma.Controlli.OrderByDescending(c => c.DataControllo).FirstOrDefault()
                 let mezzoRecente = ma.MezziAssegnati.Count > 0 ? ma.MezziAssegnati.Where(c => c.AssegnatoAl >= DateTime.Now && c.AssegnatoDal <= DateTime.Now).FirstOrDefault() : null
                 let sedeRecente = ma.SediAssegnate.Where(c => c.AssegnatoAl >= DateTime.Now && c.AssegnatoDal <= DateTime.Now).FirstOrDefault()

                 select new
                 {
                     IdMateriale = ma.IdMateriale,
                     GenereMateriale = ma.GenereMateriale,
                     Categoria = ma.Categoria,
                     Modello = ma.Modello,
                     Tipo = ma.Tipo,
                     NumSerie = ma.NumSerie,
                     Anno = ma.Anno,
                     DittaCostruttrice = ma.DittaCostruttrice,
                     Note = ma.Note,
                     Stato = controlloRecente.Stato != null ? controlloRecente.Stato : null,
                     MezzoAss = mezzoRecente != null ? mezzoRecente.Targa : null,
                     SedeAss = (mezzoRecente == null || mezzoRecente.Targa == null) ? sedeRecente.IdSede : null
                 }).ToList();


Grazie a questo consiglio http://stackoverflow.com/questions/32984742/max-value-linq-using-class

Grazie anche a voi per avermi dato la possibilità di chiederlo nel forum.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.