diff --git a/app/controllers/concerns/renders_member_access.rb b/app/controllers/concerns/renders_member_access.rb
index 745830181c1ecad56760eb3a2872b61c270a186b..133d797c8ac82600a33515a4a62c8a1e24692fd7 100644
--- a/app/controllers/concerns/renders_member_access.rb
+++ b/app/controllers/concerns/renders_member_access.rb
@@ -15,7 +15,8 @@ def preload_max_member_access_for_collection(klass, collection)
 
     method_name = "max_member_access_for_#{klass.name.underscore}_ids"
 
-    current_user.public_send(method_name, collection.ids) # rubocop:disable GitlabSecurity/PublicSend
+    collection_ids = collection.try(:map, &:id) || collection.ids
+    current_user.public_send(method_name, collection_ids) # rubocop:disable GitlabSecurity/PublicSend
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/app/controllers/concerns/renders_projects_list.rb b/app/controllers/concerns/renders_projects_list.rb
index 739b2be3fe9e254ca2f24ae77973c54cc8453fb4..2d37bc3f9a56e4e422bc60b316a9ca757fe1c3e6 100644
--- a/app/controllers/concerns/renders_projects_list.rb
+++ b/app/controllers/concerns/renders_projects_list.rb
@@ -1,8 +1,11 @@
 # frozen_string_literal: true
 
 module RendersProjectsList
+  include RendersMemberAccess
+
   def prepare_projects_for_rendering(projects)
     preload_max_member_access_for_collection(Project, projects)
+    current_user.preloaded_member_roles_for_projects(projects) if current_user
 
     # Call the count methods on every project, so the BatchLoader would load them all at
     # once when the entities are rendered
diff --git a/app/presenters/search_service_presenter.rb b/app/presenters/search_service_presenter.rb
index d7d959217b05e864d89089c37d242b21f8b3bdea..91e67c379c44bfbc8719c64e50f7673f9cae4acd 100644
--- a/app/presenters/search_service_presenter.rb
+++ b/app/presenters/search_service_presenter.rb
@@ -2,6 +2,7 @@
 
 class SearchServicePresenter < Gitlab::View::Presenter::Delegated
   include RendersCommits
+  include RendersProjectsList
 
   presents ::SearchService, as: :search_service
 
@@ -28,6 +29,8 @@ def search_objects
         objects.respond_to?(:eager_load) ? objects.eager_load(:status) : objects # rubocop:disable CodeReuse/ActiveRecord
       when 'commits'
         prepare_commits_for_rendering(objects)
+      when 'projects'
+        prepare_projects_for_rendering(objects)
       else
         objects
       end
diff --git a/ee/spec/requests/search_controller_spec.rb b/ee/spec/requests/search_controller_spec.rb
index ddf147f3ff78a79f3e5b993f5d612dfbd7d7e216..4497fa26eeb86c884845aeed93908d27408fe8dc 100644
--- a/ee/spec/requests/search_controller_spec.rb
+++ b/ee/spec/requests/search_controller_spec.rb
@@ -75,14 +75,9 @@ def send_search_request(params)
         let(:creation_args) { { name: 'foo' } }
         let(:params) { { search: 'foo', scope: 'projects' } }
         # some N+1 queries still exist
-        # each project requires 3 extra queries
-        #   - one count for forks
-        #   - one count for open MRs
-        #   - one count for open Issues
-        # there are 4 additional queries run for the logged in user:
-        # (1) user preferences, (1) user statuses, (1) user details, (1) users
-        # the threshold accounts for 6 projects
-        let(:threshold) { 42 }
+        # 1 for users
+        # 1 for root ancestor for each project
+        let(:threshold) { 7 }
 
         it_behaves_like 'an efficient database result'
       end
diff --git a/spec/requests/search_controller_spec.rb b/spec/requests/search_controller_spec.rb
index 98dda75a2b0d77f177aaa36516c5257994e14313..f2d4e288ddc300691c5b0da14b264858dc7b1c4c 100644
--- a/spec/requests/search_controller_spec.rb
+++ b/spec/requests/search_controller_spec.rb
@@ -66,13 +66,9 @@ def send_search_request(params)
       let(:creation_args) { { name: 'project' } }
       let(:params) { { search: 'project', scope: 'projects' } }
       # some N+1 queries still exist
-      # each project requires 3 extra queries
-      #   - one count for forks
-      #   - one count for open MRs
-      #   - one count for open Issues
-      # there are 4 additional queries run for the logged in user:
-      # (1) user preferences, (1) user statuses, (1) user details, (1) users
-      let(:threshold) { 17 }
+      # 1 for users
+      # 1 for root ancestor for each project
+      let(:threshold) { 7 }
 
       it_behaves_like 'an efficient database result'
     end