Archive for May, 2008

SharePoint Virtual Images from Microsoft

May 17th, 2008 by Tobias Zimmergren

WSS 3.0 SP1 Virtual Disk

Tonight at 08:23 Microsoft released the Windows SharePoint Services 3.0 SP1 virtual disk with Visual Studio pre-installed.

You can find the Windows SharePoint Services 3.0 SP1 here

MOSS 2007 Virtual Disk

Most of you probably already know that there’s an image out for Microsoft Office SharePoint Server 2007 to use with Virtual PC or Virtual Server 2005, but if you didn’t know:

You can find the Office SharePoint Server 2007 VHD here.

 

Sidenote: Yes, I’m still going to Egypt – Just had to pitch in the update about WSS 3.0 SP1 virtual harddrive since a lot of people attending my SharePoint Development classes asks about just that! :)

Edit: URL’s were interchanged, updated. Thanks Paresh.

Forum WebPart, Egypt and new litterature

May 16th, 2008 by Tobias Zimmergren

Hi people. As many of you guys already know I’m off to Egypt for a well deserved vacation for 2 weeks now. I’ll be back on track June 4th with lots of new material to blog about.

Here’s a quick status of all things going on:

SharePoint Forum WebPart

The SharePoint Forum WebPart that I’m currently developing is shaping up, but there’s still things that needs to be take care of before I can throw it into the wild. I was hoping to get it out as a beta already, but more prioritized things came up and I had to postpone it a few days.

I promise to get it up and running as soon as I’m back from the pyramids!

Inside the Index and Search Engines: Microsoft Office SharePoint Server 2007

I purchased MVP Patrick Tisseghem and Lars Fastrup’s latest book, Inside the Index and Search Engines which will cover a lot of the ground when it comes to enterprise search. I’ve started to read it a bit now, and it’s quite well written with many good samples. This will be the only litterature I’m bringing on my vacation to Egypt on monday ;)

Egypt – I’m off for a 2 week vacation by the pyramids

On monday I’m going to Egypt and I’ll stay there for 2 weeks on a well deserved vacation. As aforementioned, I’ll take on the "inside the index and search engines"-book while down in Egypt during some "lazy hours" and will probably have some nice feedback regarding this book when I’m back.

See you around

See you around when I’m back, with even more material on different topics regarding SharePoint.

Keep up the good work people, and I’ll just sip some Mojitos, Egyptian Whiskey and eat some good food for the next two weeks.

This post is a mere followup to my previous minor posts on the subject of SPQuery and SharePoint queries located here.

Basically this post will provide step-by-step instructions to construct your CAML (Collaborative Application Markup Language) queries using the U2U CALM Query Builder which you can find on the U2U Community Tools page.

Prerequisites

In order to be able to follow along with this step-by-step instructions you’ll need the following:

  • U2U CAML Query Builder 2007 or later
  • A site containing a Task List with some items
    • Some items with Status set to Completed
    • Some items with Status set to something else than Completed
Let’s get going!
  1. First of all, make sure you’ve got some items in your Task list:
    image
  2. Launch U2U CAML Query Builder
  3. Fill in the URL to your SharePoint site and choose weather you’d like to go in the Object Model-way or using SharePoint Web Services. I chose Connect via Object Model:
     image
  4. Select "Tasks" in the list that you’ll be presented with, and the right-hand side of the application will automatically be filled with the fields availible for that list, which will be the basis for our query:
    image

    As you can see here, there’s the option to:

    • Choose the field – the CAML Query Builder will automatically choose the InternalName
    • "Order By" – order the results being returned in any choose order
    • "Where" – Specify which results should be part of the returning resultset, this is the most vital tag if you ask me!
    • "Test Your CAML!"
      • "Editor": Enter any CAML here and hit the "Test" button in order to test the entered query directly against your List
      • "Parameters": Retrieves any parameters
      • "Result": The returning result of the query you test
        (tip: Always test your query before applying it to your code, no matter how simple it may be)

 

  1. Select the "Status" field
  2. Check "Where" and choose "Equal"  and choose the value "Completed" like this:
    image
  3. Hit the little arrow pointing to the right, and the query will be automatically created for you and you’ll get the CAML in the bottom-window like this:
    image
    IMPORTANT: When you construct your query in SharePoint later on, REMOVE the <Query> tags. See this post on the subject.
  4. Now that you’ve created the CAML you want, hit the "Test" button to the right and make sure you get the desired result!
    image
    Note: You can check the column called Status and make sure that all rows returned states "Completed"
  5. Now we’ve got our CAML Query ready to be implemented in our SharePoint code. Since we didn’t make anything complex or advanced it’ll be quite easy to implement this query, as I will show you now.
Prepare a Console Application for SharePoint Development

I will for simplicity create a Console Application to retrieve the desired SPListItem objects based on our SharePoint CAML query

  1. Create a new Console Application
  2. Add a reference to Microsoft.SharePoint.dll (Windows SharePoint Services) in order to be able to access the SharePoint object model
    image
  3. Add the following standard using-directive (Microsoft.SharePoint) in order to be able to use the classes in the SharePoint namespace:
    image
  4. Now we’re ready to roll – hang on to your camel
Implementing a normal list loop, without queries (not a good approach)

The following example is what it basically looks like at many implementations. A straight through loop that’ll basically loop EVERY item in the list and check EVERY object if it’s matching what we want – this is not a valid approach if you’ve got a couple of thousand (or even just a couple of hundred) items in the list. It’ll take way too long.

 

image 

The output is correct, but the time to walk through each item may even cause a timeout if you’ve got many thousand items in the list.
image

Implementing SharePoint (CAML) Queries using the SPQuery object (very good approach)

This will demonstrate how you achieve exactly the same result as previously demonstraded, but with less resource-hogging and much quicker.

Direct advantages:

  • Ordering, you can specify exactly in what order, sorted on any column that you want your resultset to be.
  • Filter out unwanted items (using the Where-tag you can simply choose ONLY the items you want returned)
  • SharePoint will dig right into the list and pick out the correct objects much faster than the previous example

Take a look at the following code, which will implement our previously created query:
image 
IMPORTANT: As you can see in the code above, I didn’t use the <Query> and </Query> tags provided by the U2U CAML Query Builder. If you do, your query will not work ;)

Conclusion

You may not acknowledge any performanceboost if you’ve got up to 100 items in your list, but when the list grows you’ll notice a huge difference immediately.

I did a test on my Forum Web Part where I had about 2500 posts (items in a list) and retrieved them using the first approach mentioned here (simply looping all items and using if-statements on each of them) – it resulted in timeouts all the time. When the page loaded, it took more than a minute per request, which isn’t appreciated by anyone ;)

When I made the comparsion with my SPQuery implementation to directly pick out the items I wanted, it resulted in a 1 second loadtime instead of more than a minute. This speaks a lot about how good queries are.

Yeah okay.. So what should I do now?

You should most definately refactor all your code to use Queries if you havn’t already!

Most people already do use this approach, but since I keep seeing implementations that doesn’t, I just thought I’d write this little piece up.

Hope someone can find it useful.

Introduction to SharePoint Queries

May 4th, 2008 by Tobias Zimmergren

Prephase

Recently I’ve been using SharePoint Queries more and more, not to say in my latest personal project: Zimmergren Forum WebPart. At times when I’ve been out at some clients to help them either refactor existing code or build new code, weather doing it myself of joining an existing SharePoint team – I always bump into things that could be solved using Queries instead of the way they’ve solved it using for- and foreach loops to go through entire lists with if-statements checking if that’s what they’re looking for.

Example: Code not using queries – Get all SPListItem objects that matches a value in a specified field

The following few lines of code is a sample of how you could fetch some SPListItems and check weather they’re what you’re looking for or not – without using SharePoint Queries (SPQuery). I’ve seen this kind of implementation one time too many and thought that it’d try to clarify the benefits with using SharePoint Queries.

Sample code without queries:

int counter = 0;
SPList myList = SPContext.Current.Web.Lists["ForumList"];
foreach (SPListItem forumItem in myList.Items)
{
    if (forumItem["ForumID"].ToString() == forumID.ToString())
        counter++;
}
return counter;

This code will work well if you don’t have too many items in your list. But if you’d have a couple of hundred or even thousand items in the list, it’d take way too long to loop through each of these items to see if the ForumID matches the item’s forumID.

Example: Code using queries – Get all SPListItem objects that matches a value in a specified field

To solve this issue, you should instead make use of the SPQuery (Microsoft.SharePoint.SPQuery) object in order to retreive only the items that actually contains the ForumID that you’re looking for – without the need for checking each and every item in the list. This will increase performance drastically if you’ve got a couple of thousand items in a list and making a lot of calls to the method that gathers listitems.

Sample code that makes use of SharePoint Queries (SPQuery)

SPList myList = SPContext.Current.Web.Lists["ForumList"];

SPQuery query = new SPQuery();
query.Query = string.Format(
    "<Where>"+
      "<Eq>"+
         "<FieldRef Name=’ForumID’ />"+
         "<Value Type=’Number’>{0}</Value>"+
      "</Eq>"+
   "</Where>", forumID); //forumID comes as a parameter to the method being called

SPListItemCollection listItems = myList.GetItems(query);

return listItems.Count;

The code above will significally increase performance of your code if there’s plenty of items in the list.

Conclusion

This post was not meant to teach the technique of using SharePoint queries, but rather to enlighten you on the fact that there’s a performance boost if you learn to use SPQuery instead of a bunch of if-statements to get specific ListItems.

I’ll cover the basics and more all-around techniques of using Queries in my next blogpost!

SPQuery returning all items

May 2nd, 2008 by Tobias Zimmergren

If you’ve ever used the SPQuery objects to get SPListItems from a SPList, and you didn’t get it to work because the query would return ALL items in the SPList, you might have used code similar to this:

SPQuery postsQuery = new SPQuery();
postsQuery.Query = string.Format(
    "<Query>"+
       "<OrderBy>"+
          "<FieldRef Name=’Created’ />" +
       "</OrderBy>"+
       "<Where>"+
          "<Eq>"+
             "<FieldRef Name=’ThreadID’ />"+
             "<Value Type=’Number’>{0}</Value>"+
          "</Eq>"+
       "</Where>"+
    "</Query>", threadID);

SPList allPosts = SpecificForumData.GetPostList(); // Custom method to get the SPList object
SPListItemCollection posts = allPosts.GetItems(postsQuery);

I’ve always built my queries by hand (what better way to learn than trial and error, right?), but when I tried the U2U CAML Query Builder to construct my SPQuery it suddenly all failed, and all items in the SPList was returned.

To solve this issue, just remove the <Query> and </Query> tags from the generated query that U2U CAML Query Builder produces and it should all work again.

So, replace the above code with this:

SPQuery postsQuery = new SPQuery();
postsQuery.Query = string.Format(
       "<OrderBy>"+
          "<FieldRef Name=’Created’ />" +
       "</OrderBy>"+
       "<Where>"+
          "<Eq>"+
             "<FieldRef Name=’ThreadID’ />"+
             "<Value Type=’Number’>{0}</Value>"+
          "</Eq>"+
       "</Where>", threadID);

SPList allPosts = SpecificForumData.GetPostList(); // Custom method to get the SPList object
SPListItemCollection posts = allPosts.GetItems(postsQuery);

If all is well, you should now be able to run this query to get better performance AND return only the selected SPListItem objects from the SPList

Edit: As a result of Peter’s comment, I’d also like to mention that the RowLimit of an SPQuery object is set to 100 per default, so if you do not alter the .RowLimit property you’ll end up with a result set of maximum 100 items. Thanks Peter

Hope it helps someone :)