c# - How to get an EF query to compile the most optimised SQL? -
i'm new ef, , has been bugging me couple of days now:
i have user entity. has parent workspace, has collection of users. each user has collection of children schedule, in user.schedules property.
i'm navigating through objects this:
var query = myuser.workspace.users.selectmany(u => u.schedules);
when enumerating results of query
(myuser instance of user has been loaded using .find(userid)), noticed ef makes 1 query db each user in workspace.users
how come ef doesn't results in 1 single query, starting primary key of myuser, , joining on tables involved?
if else directly context such this, works fine though:
context.users.where(u => u.id = userid).selectmany(u => u.workspace.users.selectmany(u => u.schedules))
is there i'm doing wrong?
let take first query:
var query = myuser.workspace.users.selectmany(u => u.schedules);
if @ type of query
variable, you'll see ienumerable<schedule>
, means regular linq objects query. why? because starts materialized object, accession object/collection etc. combined ef lazy loading feature leading multiple database query behavior.
if same second query:
var query = context.users.where(u => u.id = userid) .selectmany(u => u.workspace.users.selectmany(u => u.schedules))
you'll notice type of query
iqueryable<schedule>
, means have linq entities query. because neither context.users
nor other object/collections used inside query real objects - metadata used build, execute , materialize query.
to recap, not doing wrong. lazy loading works way. if don't care called n+1 query issue, can use first approach. if care, use second.
Comments
Post a Comment