LINQ To Entities - M to M selection returns more columns than needed
I have the following situation which, works fine:
IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date
).ToList();
Checking with SQL Profiles, this translates in 1 SQL query which correctly extract Id, Name and Date from the union.
The problem arises when I perform a join with a many-to-many connected table:
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date,
e.Types.Select(t => t.Name)
// or also just e.Types
).ToList();
The generated SQL query for some reasons not only return the "needed" columns but returns all the columns in the Experiment table + the additional specified columns (i.e. types' names).
This result in a pretty big loss in performances.
Btw, in the code I later need to perform:
experimentsList.Select(e => new
e.Id,
e.Name,
e.Date,
Types = string.Join(", ", e.Types)
)
So I need the faster way to have in memory Id, Name, Date + a list of types.
Thanks!
c# linq linq-to-entities
add a comment |
I have the following situation which, works fine:
IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date
).ToList();
Checking with SQL Profiles, this translates in 1 SQL query which correctly extract Id, Name and Date from the union.
The problem arises when I perform a join with a many-to-many connected table:
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date,
e.Types.Select(t => t.Name)
// or also just e.Types
).ToList();
The generated SQL query for some reasons not only return the "needed" columns but returns all the columns in the Experiment table + the additional specified columns (i.e. types' names).
This result in a pretty big loss in performances.
Btw, in the code I later need to perform:
experimentsList.Select(e => new
e.Id,
e.Name,
e.Date,
Types = string.Join(", ", e.Types)
)
So I need the faster way to have in memory Id, Name, Date + a list of types.
Thanks!
c# linq linq-to-entities
Removinglinq-to-sql
: that is a different LINQ provider to EF and will only confuse things.
– Richard
Nov 12 '18 at 14:13
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00
add a comment |
I have the following situation which, works fine:
IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date
).ToList();
Checking with SQL Profiles, this translates in 1 SQL query which correctly extract Id, Name and Date from the union.
The problem arises when I perform a join with a many-to-many connected table:
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date,
e.Types.Select(t => t.Name)
// or also just e.Types
).ToList();
The generated SQL query for some reasons not only return the "needed" columns but returns all the columns in the Experiment table + the additional specified columns (i.e. types' names).
This result in a pretty big loss in performances.
Btw, in the code I later need to perform:
experimentsList.Select(e => new
e.Id,
e.Name,
e.Date,
Types = string.Join(", ", e.Types)
)
So I need the faster way to have in memory Id, Name, Date + a list of types.
Thanks!
c# linq linq-to-entities
I have the following situation which, works fine:
IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date
).ToList();
Checking with SQL Profiles, this translates in 1 SQL query which correctly extract Id, Name and Date from the union.
The problem arises when I perform a join with a many-to-many connected table:
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
e.Id,
e.Name,
e.Date,
e.Types.Select(t => t.Name)
// or also just e.Types
).ToList();
The generated SQL query for some reasons not only return the "needed" columns but returns all the columns in the Experiment table + the additional specified columns (i.e. types' names).
This result in a pretty big loss in performances.
Btw, in the code I later need to perform:
experimentsList.Select(e => new
e.Id,
e.Name,
e.Date,
Types = string.Join(", ", e.Types)
)
So I need the faster way to have in memory Id, Name, Date + a list of types.
Thanks!
c# linq linq-to-entities
c# linq linq-to-entities
edited Nov 12 '18 at 14:17
Guido Lo Spacy
asked Nov 12 '18 at 14:10
Guido Lo SpacyGuido Lo Spacy
111115
111115
Removinglinq-to-sql
: that is a different LINQ provider to EF and will only confuse things.
– Richard
Nov 12 '18 at 14:13
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00
add a comment |
Removinglinq-to-sql
: that is a different LINQ provider to EF and will only confuse things.
– Richard
Nov 12 '18 at 14:13
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00
Removing
linq-to-sql
: that is a different LINQ provider to EF and will only confuse things.– Richard
Nov 12 '18 at 14:13
Removing
linq-to-sql
: that is a different LINQ provider to EF and will only confuse things.– Richard
Nov 12 '18 at 14:13
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00
add a comment |
1 Answer
1
active
oldest
votes
Can you try this? Coloum names may need to be changed
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
exp.Id,
exp.Name,
exp.Date,
t.Name
).ToList();
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53263926%2flinq-to-entities-m-to-m-selection-returns-more-columns-than-needed%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Can you try this? Coloum names may need to be changed
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
exp.Id,
exp.Name,
exp.Date,
t.Name
).ToList();
add a comment |
Can you try this? Coloum names may need to be changed
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
exp.Id,
exp.Name,
exp.Date,
t.Name
).ToList();
add a comment |
Can you try this? Coloum names may need to be changed
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
exp.Id,
exp.Name,
exp.Date,
t.Name
).ToList();
Can you try this? Coloum names may need to be changed
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
exp.Id,
exp.Name,
exp.Date,
t.Name
).ToList();
answered Nov 12 '18 at 14:21
R2D2R2D2
1,09511118
1,09511118
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53263926%2flinq-to-entities-m-to-m-selection-returns-more-columns-than-needed%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Removing
linq-to-sql
: that is a different LINQ provider to EF and will only confuse things.– Richard
Nov 12 '18 at 14:13
Why are you using Any and not join? I expect you want Join.
– Hogan
Nov 12 '18 at 15:00