56 messaggi dal 17 maggio 2011
Ciao a tutti,

Sto cercando di costruire una interrogazione che effettui un prodotto cartesiano per esporre le tuple e abbia degli include al fine di eseguire 1 sola interrogazione.
Le proprietà di navigazione sono virtual.
            var Plants = from plant in db.Plants.Include(c=>c.City)
                         join userPlant in db.AspNetUserPlants on new { id = plant.Id, us = UserId } equals new { id = userPlant.Plant_Id, us = userPlant.User_Id } 
                         select plant;

            if (PlantName != "" && PlantName != null)
                Plants = Plants.Where(f => f.BussinesName.Contains(PlantName));
            if (PlantCode != "" && PlantCode != null)
                Plants = Plants.Where(f => f.Code.Contains(PlantCode));


Da quello che ho notato se io metto la join mi annulla l'include, anche la query risultate non ha join verso city.....
Come mai questo comportamento?

Ciao a tt
Paolo
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,
spiega che tuple devi ottenere. Tuple di quali 2 tipi di entità?
Sei sicuro di volere il prodotto cartesiano e non una semplice join come stavi facendo?

ciao,
Moreno

Enjoy learning and just keep making
56 messaggi dal 17 maggio 2011
Ciao,

AspNetUserPlant Ha : User_Id e Plant_Id

Questo mi permette di sapere quale utente ha accesso a quale impianto.
Con una join dove AspNetUserPlant.User_Id = "Utente attualmente connesso" e AspNetUserPlant.Plant_Id = Plant_Id ottengo tutti i Plant che hanno una tupla in AspNetUserPlant con le precedenti caratteristiche.
Da qui voglio ottenere tutti i Plant con le prop di navigazione ad esempio City
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo, scusa il ritardo, sono stato un po' impegnato.


Con una join dove AspNetUserPlant.User_Id = "Utente attualmente connesso" e AspNetUserPlant.Plant_Id = Plant_Id

Però non c'è bisogno di fare una join, puoi sempre usare le proprietà di navigazione.
Per esempio:


var plants = from plant in db.Plants.Include(c => c.City)
             where plant.Users.Any(u => u.UserId == UserId)
             select plant;


Questo esempio suppone che nella tua classe Plant esista una proprietà di navigazione Users che ti permette di accedere agli utenti abilitati a quella Plant. Devi aver mappato questa relazione come molti a molti. Qui è spiegato come fare:
https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

ciao,
Moreno
Modificato da BrightSoul il 23 maggio 2019 21:44 -

Enjoy learning and just keep making
56 messaggi dal 17 maggio 2011
Ciao Moreno,

Ciao Paolo, scusa il ritardo, sono stato un po' impegnato.

Ma scherzi scusarti, dopo tutto l'aiuto che dai alla community...

Ci ho messo un pò a capire la risposta, non sapevo che EF potesse creare automaticamente le tabelle di relazioni molti a molti, come nell'esempio che mi hai riportato.

In per ora ho creato da me il model AspNetUserPlants.

Ho poi seguito il tuo consiglio di creare una proprietà di navigazione da plants a aspnetuserplant e con la clausula any, ottengo il risultato che volevo.

Ritieni migliore far gestire a EF la relazione molti a molti, oppure anche nel mio caso creare a mano il model AspNetUserPlants è indifferente?

Comunque grazie mille dell'aiuto.

Ciao
Paolo
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,


Ritieni migliore far gestire a EF la relazione molti a molti, oppure anche nel mio caso creare a mano il model AspNetUserPlants è indifferente?


Va bene anche come hai fatto tu.
Per esempio nel nuovo Entity Framework Core neanche c'è la possibilità (ancora) di mappare relazioni molti a molti. Semplicemente le si mappano come due relazioni uno-a-molti come hai fatto tu.

ciao,
Moreno

Enjoy learning and just keep making

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.