I feel like I'm very close on this one.

I know how to get the root site collection from this:

How can I get the root site collection from SPContext.Current?

I've been messing around with SPSiteDataQuery, but this seems to be designed to get list items, not information about the parent list.

What I need is to get every SPList for an entire Site. I need to get name, id and parentweb so that a user can select a list, and I can access it directly in the future by SPList:Guid and ParentWeb:Guid

It seems easy to do this recursively by looping through SPContext.Current.Web.Site.WebApplication.Sites and getting AllWebs as shown here:


Is this the best way to do this? It seems quite inefficient.

  • Why not create all the lists in a single site, if your plan is to bypass the site hierarchy anyway?
    – Christophe
    Oct 4, 2012 at 19:08
  • Because this is going to be a Site Definition that can be deployed anywhere, and I'm creating a UI to allow people to pull in content from all over the farm.
    – Wesley
    Oct 4, 2012 at 19:13
  • Approximately how many sites and lists are we talking about here? Is it going to be a fixed number or will it grow over time? Oct 4, 2012 at 19:35
  • For the Site Collection, the SPContext you'd want is SPContext.Current.Site.RootWeb - what you have would do all Site Collections in the Web Application.
    – lgaud
    Oct 4, 2012 at 19:39

2 Answers 2


There is no buildin way to get all the lists in a site collection.

Your method of looping through AllWebs and getting the Lists collection for each is the only way, but it's not efficient, so you probably want to build some cache or maintain your own list and updated it using a EventReceiver each time a list is create/delete or when a site is deleted.

But in order for your UI presenting the users with a list of all lists to be useful then your site collection should be very small in which case you might just do looping.


Have a look here: SPSiteDataQuery vs. Recursive SPWeb.Lists Performance

I believe your question is very similar to that one.

  • Yeah, I've seen that, but that answer is just another question complaining about lack of support. I'm looking either for confirmation that my method is sufficient, or for an alternative that is better.
    – Wesley
    Oct 5, 2012 at 4:06
  • Did you try getting the ListItems using SPSiteDataQuery and then doing the SPListItem.ParentList to get the List? I think this approach would be better performance wise. But of course the recommended approach will always be to check the actual performance of the code in your environment. Oct 5, 2012 at 4:50
  • I thought about that, but on a large enterprise farm this could be hundreds of thousands if not millions of list items. Every item would grab this information and send it to a collection where I would have to check for duplicates. Additionally, SPSiteDataQuery returns a datatable, not an SPListItemCollection, so that information would have to be mined to begin with.
    – Wesley
    Oct 5, 2012 at 16:47

Your Answer

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

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