Consider following entity model:
public class Parent
{
public virtual FirstChild FirstChild { get; set; }
public virtual SecondChild SecondChild { get; set; }
}
In my code, I have loaded Parent
entity:
Parent parent = <loaded in some way>;
To explicitly load its navigational properties, I use
db.Entry(parent).Reference(p => p.FirstChild).Load();
db.Entry(parent).Reference(p => p.SecondChild).Load();
But this results in two DB queries.
Question: is there a more elegant way, that would allow to explicitly load more than one navigational property in single query?
If I didn't have parent
loaded, I would do eager loading:
Parent parent = db.Parents
.Include(p => p.FirstChild)
.Include(p => p.SecondChild)
.FirstOrDefault();
but, as I mentioned, I already have it loaded without related entities (and I can't modify the loading code).
The only possible way (afaik) is to reload the parent property. Assuming the variable parent
is attached to the context:
var tmp = db.Parents
.Include(p => p.FirstChild)
.Include(p => p.SecondChild)
.FirstOrDefault(p => p.Equals(parent));
// tmp and parent are the same instance now!
var isTrue = ReferenceEquals(tmp, parent);
var child1 = parent.FirstChild; // is already loaded
var child2 = parent.SecondChild; // is already loaded
This works, because the context will detect that entity you are looking for is loaded and attached already and therefore not create a new one but rather update the old one (parent
in this case).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With