47 messaggi dal 17 maggio 2011
Ciao a tutti,

Sto riscontrando seri problemi con Linq e non riesco a capire come poter tradurre una paricolare sql.
Panorama:
Ho implementato l'autenticazione di AspNet.
La mia IdentityUser l'ho estesa con la seguente proprietà di navigazione :

public virtual ICollection<AspNetUserSociety> AspNetUserSocieties { get; set; }

Che non è nient'altro che una entita formata da Id, User_Id, Society_Id.
Questo per indicare a quali società fa riferimento un utente.

Nel caso io volessi recuperare tutti gli utenti che fanno parte della società 1 e della società 2 (1 e 2 li devo construire dinamicamente) non ho idea come fare.

SQL funzionante :
NB : su db.Users il metodo .SqlQuery non esiste, cosa appena scoperta percui sono partito da AspNelUserSocieties

var usList = db.AspNetUserSocieties.SqlQuery(@"SELECT * FROM AspNetUserSocieties
WHERE AspNetUserSocieties.Society_Id =1 Or AspNetUserSocieties.Society_Id =2
GROUP BY User_Id, Id,Society_Id")
.ToList();

In questo modo ottengo AspNetUserSocieties da cui, tramite la proprietà di navigazione user ottengo finalmente il mio utente.

Con Linq sono arrivato qui
var us = db.Users.Find(this.User.Identity.GetUserId());
            var LstUsr = db.AspNetUserSocieties.ToList();
            foreach (var sc in us.AspNetUserSocieties)
            {
                LstUsr = LstUsr.Where(f=>f.Society_Id == sc.Society_Id).ToList();
            }
            LstUsr = LstUsr.GroupBy(f=>f.User_Id).ToList();


In pratica da utente identity devo estrarre tutte le società a cui appartiene.
Da li filtrare tutti gli utenti che appartengono ad almeno una delle società di Identity.
NON ho la minima idea di come farlo e in rete ho fatto solo una gran confusione.

Secondo me SQL era più semplice.

Grazie a tutti dell'aiuto.
11.726 messaggi dal 09 febbraio 2002
Contributi
Ciao,

sono partito da AspNelUserSocieties

Puoi anche partire da Users. Il piano è questo: ottieni solo gli utenti che appartengono ad almeno una società che porta uno degli id del tuo insieme. Quindi prova:
List<User> usersInSocieties = db.Users
                .Where(user => user.AspNetUserSocieties.Any(society => intIdList.Contains(society.Id)))
                .ToList();

Il trucco qui è usare AspNetUserSocieties.Any nella Where per indicare che l'utente deve essere preso se una qualsiasi delle sue società rientra nell'insieme di id.

A proposito dell'insieme di id, qui ho usato la variabile intIdList che ho ottenuto così. Io non lo so come ti arrivano gli id delle società. Ho presupposto che ti arrivassero come stringa, separati da virgola. Questo va prima della query LINQ.
//Questo ti arriva dall'input dell'utente
string idList = "1, 5, 9";
//Questo è l'array di interi usato nella query LINQ
int[] intIdList = Array.ConvertAll(idList.Replace(" ", "").Split(','), int.Parse);



Secondo me SQL era più semplice.

È solo che hai più esperienza con le query SQL e perciò hai l'impressione che LINQ sia più complicato, ma ti assicuro che è ugualmente semplice.

ciao,
Moreno
Modificato da BrightSoul il 03 aprile 2019 22:49 -

Enjoy learning and just keep making
47 messaggi dal 17 maggio 2011
Non posso aggiungere altro, risposta chiara e cristallina.
Perfettamente funzionante.
Sei un grande grazie.

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.