Supponiamo che io abbia due classi che hanno una relazione molti-a-uno
public class ParentObject{
public int Id { get; set; }
public List<ChildObject> Children { get; set; }
...
}
public class ChildObject{
public int Id { get; set; }
public ParentObject Parent { get; set; }
}
Quando aggiungo la migrazione e aggiorno il database, il risultato sono due tabelle:
Ora voglio cercare tutti i figli di un particolare genitore. In SQL, posso farlo senza dover unirmi alla tabella genitore semplicemente interrogando sulla colonna ChildObject.ParentObjectId .
SELECT * FROM [ChildObject] c WHERE c.ParentObjectId = parentId
Ma in EF Core, l'unico modo che ho trovato per farlo è usare .Include(c => c.Parent)
e poi .FirstOrDefault(c => c.Parent.Id == parentId)
. Questo crea un join alla tabella ParentObject .
C'è un modo per interrogare la tabella ChildObject senza .Include()
?
Basta usare la proprietà di navigazione per accedere al PK principale:
var children = db.Children
.Where(c => c.Parent.Id == parentId)
.ToList();
Se includi qualche altra proprietà dell'entità Parent
in Where
, OrderBy
, Select
(o il Parent
stesso all'interno di Select
o Include
), ovviamente EF Core creerà un join. Ma se si accede solo al PK dell'entità correlata, EF Core è abbastanza intelligente da usare invece l'FK ed evitare il join.
Si noti che gli oggetti Child
restituiti non avranno la proprietà Parent
popolata (sarà null
), tranne che il contesto non sta già monitorando un'istanza di entità Parent
con quel PK.