352 messaggi dal 08 febbraio 2009
Salve a tutti.

Non so come scrivere in linq una query che fa riferimento ad una relazione n ad m.

Nel mio modello ho una situazione simile alla seguente:


public class Utente
{

...

   public ICollection<Ruolo> Ruoli
   {
    ....
   }
}


public class Ruolo
{

    public ICollection<Utente> Utenti
    {
    }
}




Ora vorrei scrivere una query che mi dia l'elenco degli utenti e la descrizione del primo ruolo a cui appartengono.

Pensavo quindi di scrivere qualcosa di simile a:


var query = from u in MyDbContext.Utenti
                   select new { Id = u.Id, Nome = u.Nome, Ruolo = u.Ruoli.FirstOrDefault().Descrizione };



La query però non estrae alcuna riga. Specifico che per il momento non ho alcun ruolo inserito, quindi mi aspettavo di vedere 2 righe (ho due utenti) con una descrizione vuota.

Dato che non estrae nulla, ho provato a scrivere questa query



var query = from u in MyDbContext.Utenti
                   select new { Id = u.Id, Nome = u.Nome, NumeroRuoli = u.Ruoli.Count() };




In questo caso mi estrae giustamente due righe con numero ruoli 0...


Qualcuno sa dirmi come devo fare? Per caso devo implementare da qualche parte il modo in cui il DbContext deve interpretare il "FirstOrDefault"?

Grazie mille
5.390 messaggi dal 09 febbraio 2002
Contributi
Ciao, questo pezzo della query non ti solleva forse un'eccezione?
u.Ruoli.FirstOrDefault().Descrizione
Quando ti si materializza l'utente che non possiede ruoli, l'extension method .FirstOrDefault restituisce null e quindi l'accesso alla proprietà .Descrizione dovrebbe causare un errore a runtime.

Con LINQ to Object potresti usare il metodo .DefaultIfEmpty per definire un oggetto Ruolo da restituire nel caso la lista fosse vuota.
u.Ruoli.DefaultIfEmpty(new Ruolo()).First().Descrizione
Ma questo uso di DefaultIfEmpty non è supportato da Linq to Entites. Il Linq provider giustamente non saprebbe come "tradurre" l'istanza del Ruolo in una query SQL. Quindi prova con una cosa del genere, usando l'operatore ternario per valutare se il primo elemento della lista è null o meno:

var query = from u in MyDbContext.Utenti
            let primo = u.FirstOrDefault()
            select new { Id = u.Id, Nome = u.Nome, Ruolo = (primo == null ? null: primo.Descrizione)) };


ciao
Modificato da BrightSoul il 26 gennaio 2012 22.57 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!

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.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC