HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Refactor VB.NET to C#.Net using Linq

Submitted by: @import:stackexchange-codereview··
0
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:

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.