patterncsharpMinor
Refactor VB.NET to C#.Net using Linq
Viewed 0 times
netlinqrefactorusing
Problem
I am rewriting a VB.NET application in C#. I will not subject you to the original code because it's pretty messy. Below is the converted C# code:
As you can see, I am committing a grievous error in making a call to the database many times.
I am not sure how to append the loop to my query so that I only call the context one time.
public IEnumerable GetQueries(Request request)
{
var queries = new List();
foreach (var report in request.Reports)
{
queries.AddRange((from query in _context.WebQueries
join qg in _context.WebQueryGroups on query.QueryKey equals qg.QueryKey
join wp in _context.WebPermissions on qg.QueryGroupNameKey equals wp.TaskGroupNameKey
join wugn in _context.WebUserGroupNames on wp.UserGroupNameKey equals wugn.UserGroupNameKey
join wug in _context.WebUserGroups on wugn.UserGroupNameKey equals wug.UserGroupNameKey
join wt in _context.WebTasks on query.QueryCategory equals wt.TaskReportCategory
where wt.TaskKey == request.Key && wp.ResourceKey == 4 && wt.TaskKey == request.Key && wug.UserKey == report.UserKey
select query).OrderBy(x => x.QueryTitle));
}
return queries;
}As you can see, I am committing a grievous error in making a call to the database many times.
I am not sure how to append the loop to my query so that I only call the context one time.
Solution
Have you tried:
?
public IEnumerable GetQueries(Request request)
{
List keys = request.Reports.Select(i => i.UserKey).ToList();
var queries = new List();
queries.AddRange((from query in _context.WebQueries
join qg in _context.WebQueryGroups on query.QueryKey equals qg.QueryKey
join wp in _context.WebPermissions on qg.QueryGroupNameKey equals wp.TaskGroupNameKey
join wugn in _context.WebUserGroupNames on wp.UserGroupNameKey equals wugn.UserGroupNameKey
join wug in _context.WebUserGroups on wugn.UserGroupNameKey equals wug.UserGroupNameKey
join wt in _context.WebTasks on query.QueryCategory equals wt.TaskReportCategory
where wt.TaskKey == request.Key
&& wp.ResourceKey == 4
&& wt.TaskKey == request.Key
&& keys.Contains(wug.UserKey)
select query).OrderBy(x => x.QueryTitle));
return queries;
}?
Code Snippets
public IEnumerable<WebQuery> GetQueries(Request request)
{
List<string> keys = request.Reports.Select(i => i.UserKey).ToList();
var queries = new List<WebQuery>();
queries.AddRange((from query in _context.WebQueries
join qg in _context.WebQueryGroups on query.QueryKey equals qg.QueryKey
join wp in _context.WebPermissions on qg.QueryGroupNameKey equals wp.TaskGroupNameKey
join wugn in _context.WebUserGroupNames on wp.UserGroupNameKey equals wugn.UserGroupNameKey
join wug in _context.WebUserGroups on wugn.UserGroupNameKey equals wug.UserGroupNameKey
join wt in _context.WebTasks on query.QueryCategory equals wt.TaskReportCategory
where wt.TaskKey == request.Key
&& wp.ResourceKey == 4
&& wt.TaskKey == request.Key
&& keys.Contains(wug.UserKey)
select query).OrderBy(x => x.QueryTitle));
return queries;
}Context
StackExchange Code Review Q#58267, answer score: 4
Revisions (0)
No revisions yet.