4
\$\begingroup\$

I've got a situation where I have a list of Organizations (code to follow), and a user has a list of OrganizationIds (ints). I want to filter down the full list of Organizations using the User's OrganizationId list for a dropdown list. The query works, but it feels like there may be a more optimal way to write it. Is there, or am I already pretty much optimized?

public class Organization
{
    public int Id { get; set; }
    public string Division { get; set; }
    public bool IsActive { get; set; }
    public bool IsDefault { get; set; }
    public string Name { get; set; }
}

Query

vm.locations = _organizations.GetOrganizations().Where(o => ((ApplicationUser)User).OrganizationIdList.Any(u => u == o.Id)).Select(org =>
    new SelectListItem
    {
        Text = org.Division + " - " + org.Name,
        Value = org.Id.ToString()
    }).OrderBy(item => item.Text);
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

Use a Dictionary<int, Organization> to look up organizations by their IDs quickly.

Your code will then look like this: OrganizationIdList.Select(id => organizations[id])....


Given your clarification in the comments that your are getting organizations from a database, you should let the database do the hard work for you. The code will depend upon the ORM you're using, but a relatively SQL-agnostic version of the query will look like this:

SELECT organization_id, division, name FROM organizations WHERE organization_id IN (?)

or this:

SELECT organization_id, division, name FROM organizations JOIN user_organizations
USING (organization_id) WHERE user_id = ?
\$\endgroup\$
4
  • \$\begingroup\$ GetOrganizations() returns a List<Organization> -- wouldn't the conversion to a Dictionary be more intensive? (I agree this is clearer and cleaner, though!) \$\endgroup\$ Aug 27, 2014 at 22:36
  • \$\begingroup\$ @pennstatephil can you change GetOrganizations? Do the organizations change over time? Are they coming from a database? It's hard to recommend what to do without more context. \$\endgroup\$
    – mjolka
    Aug 27, 2014 at 22:39
  • \$\begingroup\$ they are indeed coming from a DB. while changes are not likely to happen often, they can occur. \$\endgroup\$ Aug 27, 2014 at 22:41
  • \$\begingroup\$ @pennstatephil then you should let the db do the work for you. Either select from organizations where organization_id in ... Or select from organizations join users using organization_id where user_id = ... \$\endgroup\$
    – mjolka
    Aug 27, 2014 at 22:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.