<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUACSXs5eSp7ImA9WhRUFko.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923</id><updated>2012-01-27T14:16:08.521Z</updated><category term="sharepoint client object model javascript ecmascript" /><category term="calendar" /><category term="xsl" /><category term="web part" /><category term="introductory" /><category term="quicktip" /><category term="SQL" /><category term="DTExec" /><category term="documentation" /><category term="funny" /><category term="developnent" /><category term="google news" /><category term="development" /><category term="sharepoint 2010" /><category term="community" /><category term="events" /><category term="wspbuilder" /><category term="Schema" /><category term="tldr" /><category term="ASP.NET" /><category term="Analysis Services" /><category term="c#" /><category term="psychology" /><category term="Refresh" /><category term="css" /><category term="masterpage" /><category term="object model" /><category term="end user" /><category term="rss" /><category term="year to view" /><category term=".net" /><category term="performance" /><category term="Error" /><category term="SSIS" /><category term="review" /><category term="training" /><category term="dataviewwebpart" /><category term="xml" /><category term="business" /><category term="iis" /><category term="ia" /><category term="spevo" /><category term="office humour" /><category term="sharepoint fba sessions" /><category term="suguk" /><category term="ux" /><category term="themes" /><category term="permissions" /><category term="VMware" /><category term="Temporary Tables" /><category term="visual web part" /><category term="html" /><category term="SSAS" /><category term="T-SQL" /><category term="testing" /><category term="blogging" /><category term="moss" /><category term="MDX" /><category term="web design" /><category term="curiosity" /><category term="sandbox" /><category term="event handlers" /><category term="information architecture" /><category term="sharepoint roles fba" /><category term="sharepoint ribbon fluent ui c#" /><category term="javascript" /><category term="dataformwebpart" /><category term="SQL Server Integration Services" /><category term="SQL Server" /><category term="rollup" /><category term="web development" /><category term="solutions" /><category term="under the bonnet" /><category term="beginners" /><category term="sharepoint" /><category term="csharp" /><category term="newbies" /><category term="pointless" /><category term="webparts" /><category term="content management" /><category term="typography" /><category term="sharepoint designer" /><category term="cms" /><category term="analysis" /><category term="enterprise" /><category term="swot" /><category term="code" /><category term="database" /><category term="sharepoint branding css video" /><category term="snippet" /><category term="OLAP" /><category term="research" /><category term="rage" /><category term="awesome" /><category term="programming" /><category term="tutorial" /><category term="Stored Procedures" /><category term="xslt" /><category term="book" /><category term="delegates" /><category term="http 503" /><category term="twitter" /><category term="visual studio 2010" /><category term="search" /><category term="endusersharepoint" /><category term="project management" /><category term="social media" /><category term="id-live" /><category term="writing" /><category term="sharepoint 2007" /><title>Chronicles of a Chronic E-Junkie</title><subtitle type="html">Pearls of (mostly) Microsoft SharePoint knowledge and wisdom.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://e-junkie-chronicles.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/QkILp" /><feedburner:info uri="blogspot/qkilp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEEGQXw-eSp7ImA9WhRWEUs.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-301855872839779355</id><published>2011-12-29T12:40:00.004Z</published><updated>2011-12-29T12:43:40.251Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-29T12:43:40.251Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="end user" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Book Review - Microsoft SharePoint 2010 Power User Cookbook</title><content type="html">&lt;div class="MsoNormal"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.amazon.co.uk/gp/product/1849682887/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51evv0+1PxL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU02_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The Microsoft SharePoint 2010 Power User Cookbook is the
kind of book to give to the people in the business that use SharePoint to get
their work done. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
This book does not start with a background history of
SharePoint, doesn’t fill out pages with sales figures, and doesn’t confuse the
target audience with discussions on technical topics such as the hierarchical
way SharePoint works. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
Instead, this book goes straight into getting things done.
The first chapter delves straight into using SharePoint to learn the very
fundamentals in a couple of lessons, then continuing on to provide a total of
70 easy to follow ‘recipes’ which walk you through solving every day business
problems.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
Each recipe is well structured in the same format, starting
with what environment or software the recipe has been tested on, followed by a
step by step guide on performing that task, complete with a well balanced
number of relevant screenshots. There is then a brief discussion explaining
what is happening, or what SharePoint is doing as that recipe is carried out,
written in the context of SharePoint terminology to familiarise yourself with
the workings such that you can apply that learning to more scenarios. Finally
there’s an expansion on what else SharePoint can do related to that recipe, and
a selection of recipes that are related in some way to the current recipe. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
This formula is repeated for every one of the 70 recipes,
allowing the reader to simply skip to the recipe that they want to try out at
any time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
The writing style throughout is simple to read, with a
distinct absence of lengthy paragraphs. This allows the content to be quickly
read and absorbed by the user, without being drawn in to technical and
thoughtful discussions about a particular topic.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
The book is complemented at the end with a chapter entitled
‘Joining the Dots’. This is an excellent addition, which explores the idea of
building applications with SharePoint, and introduces three ‘composite’
application scenarios. These scenarios require a combination of select recipes
from the book to build up a working application. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
The chapter opens with a discussion on how to build a
composite application in SharePoint, and the design consideration points that
should be made every time. The three scenarios are then introduced, and again
follow a set format, each describing a problem, an intended solution, and then
step-by-step details on how to accomplish the solution. After each there is
some detail on what skills and technologies have been looked at in building
that solution, as well as a list of all the recipes that were used to create
that application.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
This book is an ideal introduction to the Microsoft
SharePoint platform for the end user, written in the context of business
problems in a way that gets things done. With a lack of technical detail
usually intended for the system administrator or application programmer, the
content is targeted directly to those who use SharePoint.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-301855872839779355?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LuanAPrXFznWmo-Ysdi4D0pxLi8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LuanAPrXFznWmo-Ysdi4D0pxLi8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LuanAPrXFznWmo-Ysdi4D0pxLi8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LuanAPrXFznWmo-Ysdi4D0pxLi8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/aaS-2DQ_HHw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/301855872839779355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=301855872839779355" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/301855872839779355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/301855872839779355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/aaS-2DQ_HHw/book-review-microsoft-sharepoint-2010.html" title="Book Review - Microsoft SharePoint 2010 Power User Cookbook" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/12/book-review-microsoft-sharepoint-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYGQH0_eSp7ImA9WhRXFEw.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-1338383170377320065</id><published>2011-12-20T21:22:00.004Z</published><updated>2011-12-20T21:38:41.341Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-20T21:38:41.341Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="introductory" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="newbies" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="beginners" /><title>5 Common Mistakes Made By New SharePoint Developers</title><content type="html">&lt;div&gt;
After some time now supporting many others in the use and development of Microsoft SharePoint as a platform, I've come to notice some common traits of people who are new to developing solutions. I've decided to list the 5 most here, and I hope that these cover both those who are currently developers getting started with SharePoint, and those who've used SharePoint a little bit and have been graced with the task of developing a solution in the platform, wearing the 'developer' hat for the very first time.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;Not Understanding The Capabilities of the Platform&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let's face it. SharePoint is big. Massive.&amp;nbsp;Enormous. Possibly bloated, even. It can do one hell of a lot of things, and one of the things that trips up a developer when asked to do something in SharePoint, is that they might no realise that SharePoint already does part of what they need. So they end up reinventing the wheel. Sometimes reinventing the wheel means you end up with a bigger wheel, but also you will have to look after and support that wheel for when it breaks, and you may also have wasted a load of time making that bigger wheel. Sometimes though, the wheel that comes with SharePoint might be square shaped, and thus not do what is required, forcing one to reinvent it. Always find out if you can if SharePoint can already do something that you need it to, before embarking on development effort to build something.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Not Making Full Use Of The Tools&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The web UI can help you do a fair bit, and solve quite a fair amount of common, simple business requirements.&amp;nbsp;Then there's SharePoint Designer, which gives you a little more power. &amp;nbsp;Finally, there's the all-powerful Visual Studio. That's a wide range of capability, though people use what they're comfortable with. New developers to SharePoint will probably always hit Visual Studio first, blowing in with an over-the-top solution to a dead simple requirement such as a simple list with a couple of views, and the substantial learning curve that comes with this simple requirement that could be satisfied simply in one of the other tools. Or experienced SharePoint folks might go no further than SharePoint Designer and end up with extremely complex, over the top solutions to satisfy something that could solved really easily with a coded solution in Visual Studio, should they ever have decided to brave it. Give all the tools consideration when deciding how to implement a solution in your environment.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Not Understanding Best Practices&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There's more than a dozen ways to skin a cat and there's even more ways to accomplish tasks and satisfy requirements in SharePoint. Not all are the best idea. There's performance, security, scalability, portability and other factors to take into account with solutions. There are countless resources out there for best practices of almost every aspect of SharePoint usage and development out there.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Not Doing Any Researching&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As&amp;nbsp;aforementioned, there are countless resources out there for best practice in SharePoint Development. There are also countless resources about the capabilities of the platform. And the capabilities of the tools. But the only way you will learn about this is by doing research. Start with the &lt;a href="http://msdn.microsoft.com/en-us/sharepoint/aa905688"&gt;MSDN Developer Centre&lt;/a&gt;. Then search the interwebs for the area of SharePoint your working with, coupled with keywords such as "development, programmatically, sharepoint designer".&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Not Asking (The Right) Questions&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We have all been there. If you're a seasoned ASP.NET dev new to SharePoint, you've been there. When you were first put in front of an MVC project and told to learn it. Yesterday. There are plenty of places to ask questions. There's &lt;a href="http://sharepoint.stackexchange.com/"&gt;SharePoint StackExchange&lt;/a&gt;, &lt;a href="http://social.msdn.microsoft.com/forums/en-US/category/sharepoint/"&gt;MSDN Forums&lt;/a&gt;, LinkedIn, and you can also ask the legion of Twitter users out there, by adding the hashtag &lt;a href="http://twitter.com/#!/search/%23sphelp"&gt;#SPHelp&lt;/a&gt; to your question. You'll get the best answers by asking the questions of the ilk "Where can I get info on..." or "What's the best approach to...", rather than "Give me code to do...".&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
These five, and my little descriptions of each, are by no means in any way fully descriptive or exhaustive. There are many many more aspects that new developers need a hand with, and I believe it's up to us experienced developers in the community to ensure that new developers aren't left with a bad taste when it comes to developing in what is (when you get used to it), a pleasurable platform to develop on.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-1338383170377320065?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0uRXw21d3nZSWe7zf4gl2AnswZI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0uRXw21d3nZSWe7zf4gl2AnswZI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0uRXw21d3nZSWe7zf4gl2AnswZI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0uRXw21d3nZSWe7zf4gl2AnswZI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/6B2XliGjQjU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/1338383170377320065/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=1338383170377320065" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1338383170377320065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1338383170377320065?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/6B2XliGjQjU/5-common-mistakes-made-by-new.html" title="5 Common Mistakes Made By New SharePoint Developers" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/12/5-common-mistakes-made-by-new.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GSXs6eSp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-4768883009678974675</id><published>2011-12-15T20:22:00.002Z</published><updated>2011-12-15T20:28:48.511Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T20:28:48.511Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint roles fba" /><title>FBA Site - Unexpected Errors after App Pool Recycle</title><content type="html">Scenario - you have an FBA authenticated web application, and for some reason every time there's an application pool recycle, users are presented with error pages and cannot access any page in the site. The only way is to manually navigate to /_layouts/signout.aspx and to log back in to the site.&lt;br /&gt;
&lt;br /&gt;
Solution - In my case, the incorrect defaultProvider was specified in web.config under the roleManager section. The default was set to the OOTB Claims auth role provider, it should have been set to the name of the&amp;nbsp;&lt;strong style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px; text-align: left;"&gt;AspNetSqlRoleProvider&lt;/strong&gt;&amp;nbsp;role that we had. Double check all your web.config modifications!&lt;br /&gt;
&lt;br /&gt;
Here's ref with the web.config settings as they should be:&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff647401.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff647401.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-4768883009678974675?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cFmi-tP-FQkP8wLSnJH1YXh5C50/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cFmi-tP-FQkP8wLSnJH1YXh5C50/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cFmi-tP-FQkP8wLSnJH1YXh5C50/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cFmi-tP-FQkP8wLSnJH1YXh5C50/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/SmBC8N57fOk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/4768883009678974675/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=4768883009678974675" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/4768883009678974675?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/4768883009678974675?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/SmBC8N57fOk/fba-site-unexpected-errors-after-app.html" title="FBA Site - Unexpected Errors after App Pool Recycle" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/12/fba-site-unexpected-errors-after-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkACR3k5fSp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-2461362093735677111</id><published>2011-12-07T21:37:00.001Z</published><updated>2011-12-15T20:26:06.725Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T20:26:06.725Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint fba sessions" /><title>SharePoint 2010 FBA and Logging out when closing the browser</title><content type="html">&lt;i&gt;Upon revisiting this issue, I've discovered that this method is completely redundant thanks to the April 2011 CU. &lt;a href="http://blog.petercarson.ca/Pages/SharePoint-2010-Session-Management.aspx"&gt;Read here for more details&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Had a requirement today to have our FBA based site log the user out automatically upon closing the browser.&lt;br /&gt;
&lt;br /&gt;
Our site has 'username and password' controls on a visible portion of the web site, in a content area, not on a 'custom form' per se. Therefore we can't make use of the asp:Login control which you normally get.&lt;br /&gt;
&lt;br /&gt;
A separate requirement for needing to expire sessions after a set time helped us out with this, really simply too.&lt;br /&gt;
&lt;br /&gt;
Have a read at this first.&amp;nbsp;&lt;a href="http://jasear.wordpress.com/2011/01/10/sharepoint-2010-set-session-timout-on-a-fba-enabled-site/"&gt;SharePoint 2010: Set session timeout on a FBA enabled site&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
So, from that article, you have a custom SPHttpApplication object loaded via your Global.asax file, handling the method "SessionSecurityTokenReceived".&lt;br /&gt;
&lt;br /&gt;
In order to log the user out when the browser is closed, we basically need to set the Session's token to be non-persistent. This is simple to do as we can get or set the SessionToken object via the event's arguments.&lt;br /&gt;
&lt;br /&gt;
If you want a trimmed down version which does only the handling of expiring sessions on browser closing, then use this version of the event handler:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
    e.ReissueCookie = true;
    e.SessionToken.IsPersistent = false;
}
&lt;/pre&gt;
&lt;br /&gt;
Wire this up to your custom Global.asax file as in the link above, and you should have FBA users logged out when they close their browser.
&lt;br /&gt;
&lt;br /&gt;
No ugly Javascript hacks needed for this! Try it, let me know how well it works! If this trimmed down version doesn't work, follow the blog linked above in it's entirety, and added the IsPersistent = false line just after the ReissueCookie one.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-2461362093735677111?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1px4TwG5GmS-hwuxY-_gP5cHU5g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1px4TwG5GmS-hwuxY-_gP5cHU5g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1px4TwG5GmS-hwuxY-_gP5cHU5g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1px4TwG5GmS-hwuxY-_gP5cHU5g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/ExI2VTEz5rY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/2461362093735677111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=2461362093735677111" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2461362093735677111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2461362093735677111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/ExI2VTEz5rY/sharepoint-2010-fba-and-logging-out.html" title="SharePoint 2010 FBA and Logging out when closing the browser" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/12/sharepoint-2010-fba-and-logging-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cFR344eSp7ImA9WhRRE0k.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-7133849925619486920</id><published>2011-11-26T19:52:00.001Z</published><updated>2011-11-26T20:56:56.031Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-26T20:56:56.031Z</app:edited><title>Quickly Load Sample data into SharePoint from Wikipedia</title><content type="html">&lt;i&gt;Do remember that this application is designed solely to create sample content, not to replicate the service that Wikipedia provides. The content that appears is unformatted and without images. The content not intended for public (even for internal intranet) use, so please adhere to the&amp;nbsp;&lt;a href="http://wikimediafoundation.org/wiki/Terms_of_use"&gt;Wikipedia Terms of Service&lt;/a&gt;, and do also consider making a&amp;nbsp;&lt;a href="http://wikimediafoundation.org/w/index.php?title=WMFJA085/GB&amp;amp;utm_source=WMdonate&amp;amp;utm_medium=sidebar&amp;amp;utm_campaign=20110130SB003&amp;amp;language=en&amp;amp;uselang=en&amp;amp;country=GB&amp;amp;referrer=http%3A%2F%2Fwikimediafoundation.org%2Fwiki%2FTerms_of_use"&gt;donation to the Wikimedia Foundation&lt;/a&gt;&amp;nbsp;to support the freely available content that we have all taken for granted in these modern times.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Need to load up a couple of hundred pages into your SharePoint publishing site for testing search? Bored of Lorem Ipsum, or needing to test out different structures of content?&lt;br /&gt;
&lt;br /&gt;
Run this code in a console application which gets a random page from Wikipedia then saves to SharePoint. There is a slight pause (approximately 1 second) as it gets each document and saves it, so this shouldn't constitute as heavy traffic to Wikipedia. As aforementioned, the content is added unformatted, infact it adds the entire HTML document to the Page Content field (including all the 'edit' links, not best practice in the slightest, but all I was after was searchable content in my site).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Do note, however, that Wikipedia do offer archives of their content here:&amp;nbsp;&lt;a href="http://dumps.wikimedia.org/backup-index.html"&gt;http://dumps.wikimedia.org/backup-index.html&lt;/a&gt;&amp;nbsp;and if you're intending on populating hundreds of thousands to millions of documents to test out large scale search solutions, then use these archives combined with the bulk load tool (available from here:&amp;nbsp;&lt;a href="http://code.msdn.microsoft.com/windowsdesktop/Load-Bulk-Content-to-3f379974"&gt;http://code.msdn.microsoft.com/windowsdesktop/Load-Bulk-Content-to-3f379974&lt;/a&gt;). This methods requires downloading the entire archive (7GB worth) in one go then convert &amp;amp; upload to SharePoint directly. Use the method in this blog post to create a couple of hundred sample documents that you need to test, without downloading the entire wikipedia archive.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;In SharePoint Enterprise Search, there is the option to add an external web site as a content source and to add that to your search index. I opted with the method in this post over that, because a) I would feel that I'd be adding significantly more traffic to websites that I don't run if I indexed possibly hundreds of thousands of pages on other sites than running this code, and b) my environment doesn't have the disk space for that kind of index :] ).&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Finally, thanks to &lt;a href="http://twitter.com/toddklindt"&gt;Todd Klindt&lt;/a&gt; and &lt;a href="http://twitter.com/shaunocallaghan"&gt;Shaun O'Callaghan&lt;/a&gt; for a couple of pointers and considerations for this article.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Inspiration for this method came from an answer on&lt;a href="http://stackoverflow.com/questions/1128383/large-number-of-sample-documents"&gt; this StackExchange question&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
Create a SharePoint Publishing Portal, and change the URL in the code to point to your new site, and simply run. You could add logic to the GetPageLayout method to retrieve a random page layout each time for testing out different information architectures, such as for testing out the Refinements web part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;

namespace SampleContentGetter
{
    class MyWebClient : WebClient
    {
        Uri _responseUri;

        public Uri ResponseUri
        {
            get { return _responseUri; }
        }

        protected override WebResponse GetWebResponse(WebRequest request)
        {
            WebResponse response = base.GetWebResponse(request);
            _responseUri = response.ResponseUri;
            return response;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            string site = "http://demolab-sps2010/sites/content";
            int docsToGet = 50;

            Console.WriteLine("Opening SharePoint Site...");
            SPSite oSite = new SPSite(site);
            SPWeb oWeb = oSite.OpenWeb();
            PublishingWeb pWeb = PublishingWeb.GetPublishingWeb(oWeb);
            PageLayout[] pLayouts = pWeb.GetAvailablePageLayouts();
            PageLayout layout = GetPageLayout(pLayouts, "PageFromDocLayout.aspx");

            for (int i = 0; i &amp;lt; docsToGet; i++)
            {
                try
                {
                    Console.WriteLine(string.Format("Getting next page ({0} of {1})...", i, docsToGet));
                    string title;
                    string page1;
                    using (MyWebClient wc = new MyWebClient())
                    {
                        wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
                        page1 = wc.DownloadString("http://en.wikipedia.org/wiki/Special:Random");
                        string url = wc.ResponseUri.AbsolutePath;
                        title = Uri.UnescapeDataString(url.Substring(6));
                        Console.WriteLine("Got document: " + title);
                    }

                    Console.WriteLine("Adding to SharePoint Site...");
                    PublishingPage newPage = pWeb.AddPublishingPage(title + ".aspx", layout);
                    newPage.ListItem["PublishingPageContent"] = page1;
                    newPage.Update();
                    newPage.CheckIn("Adding content from Wikipedia");
                    newPage.ListItem.File.Publish("Adding content from Wikipedia");&lt;/pre&gt;
&lt;pre class="brush:csharp" name="code"&gt;                    newPage.ListItem.File.Approve("Adding content from Wikipedia");&lt;/pre&gt;
&lt;pre class="brush:csharp" name="code"&gt;                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message + "\nSomething odd happened, trying again....");
                }

                i++;
            }
        }

        private static PageLayout GetPageLayout(PageLayout[] layouts, string name)
        {
            foreach (PageLayout p in layouts)
            {
                if (p.Name == name)
                {
                    return p;
                }
            }
            return null;
        }
    }
}

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-7133849925619486920?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tf52Q2hlJmTjSMLzpfQdicf1-u8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tf52Q2hlJmTjSMLzpfQdicf1-u8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tf52Q2hlJmTjSMLzpfQdicf1-u8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tf52Q2hlJmTjSMLzpfQdicf1-u8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/B2WRRm5BD1g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/7133849925619486920/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=7133849925619486920" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/7133849925619486920?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/7133849925619486920?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/B2WRRm5BD1g/quickly-load-sample-data-into.html" title="Quickly Load Sample data into SharePoint from Wikipedia" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/11/quickly-load-sample-data-into.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMERng7cSp7ImA9WhdbFkQ.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-3294691757323353579</id><published>2011-10-15T15:53:00.001+01:00</published><updated>2011-10-15T17:50:07.609+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-15T17:50:07.609+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><title>Video - Enterprise Search Connectors for Windows Explorer</title><content type="html">Here's a quick video about adding a search connector into Windows Explorer - really cool feature I've only just discovered. Probably because I spent too much time buried in Visual Studio writing CAML and C#.&lt;br /&gt;
&lt;br /&gt;
Anyway, here it is - enjoy! :)&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://player.vimeo.com/video/30591263?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Update: I forgot to point out that the Search Connector in Windows is given the same display name as the title of the site - that's why I pointed out that the site is called 'Awesome Search' because that's what shows up in Windows :)&lt;br /&gt;
&lt;br /&gt;
Further reading:&amp;nbsp;&lt;a href="http://technet.microsoft.com/en-us/library/ff899315.aspx"&gt;Search the enterprise from Windows 7 (SharePoint Server 2010)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-3294691757323353579?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LghER2z1_OMw8VaNGHYWgTEOOkA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LghER2z1_OMw8VaNGHYWgTEOOkA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LghER2z1_OMw8VaNGHYWgTEOOkA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LghER2z1_OMw8VaNGHYWgTEOOkA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/83V4gSu0sb4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/3294691757323353579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=3294691757323353579" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3294691757323353579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3294691757323353579?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/83V4gSu0sb4/video-enterprise-search-connectors-for.html" title="Video - Enterprise Search Connectors for Windows Explorer" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/video-enterprise-search-connectors-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIMQH05cSp7ImA9WhdbFkQ.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-942095883759458645</id><published>2011-10-13T23:40:00.002+01:00</published><updated>2011-10-15T16:29:41.329+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-15T16:29:41.329+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="under the bonnet" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>A Closer Look at a SharePoint SQL Query using the Developer Dashboard</title><content type="html">Out of sheer curiosity and boredom, I've decided to have a poke at the huge query that is provided in the developer dashboard and shows up for nearly every page you load in SharePoint that has something to do with List Items.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
The query in particular is the one that starts 'DECLARE @DocParentRefForRF', and when you open it up it appears horrendously huge and complex. The reason it's larger than the others you'll see is because the majority of SharePoint functions performed on the database are done using Stored Procedures (which then call custom functions) in SQL Server, which are pre-compiled for performance reasons.&lt;br /&gt;
&lt;br /&gt;
This reason this query is not in a compiled, optimised stored procedure is (I can only assume) because SharePoint Lists have fields. And these fields can be added by users. These fields are not added as new fields in the database (in the database term of a field or column). Rather these fields are added as references in a table in the database that already have prepared columns set up for a number of data types for every list item. Infact, all list items in all lists are stored in a single database table in a content database. This means that this table is incredibly wide (by normal standards, but not so by SQL Server support standards. This RDBMS can support &lt;i&gt;very&lt;/i&gt;&amp;nbsp;wide tables).&lt;br /&gt;
&lt;br /&gt;
Let's first have a look at the full text, formatted by myself in a structure I hope is somewhat readable. This is pulled out when I opened a TeamSite homepage. All that's on the page is a web part list view of the Shared Documents library. The query is getting the items from that library.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;DECLARE @DocParentIdForRF uniqueidentifier 

SELECT TOP 1 @DocParentIdForRF = Docs.Id 

FROM Docs WHERE Docs.SiteId = @SITEID 
 AND Docs.DirName = @FDN 
 AND Docs.LeafName = @FLN;  

SELECT TOP(@NUMROWS) 
 t1. AS c0, 
 CASE 
  WHEN DATALENGTH(t1.DirName) = 0 THEN t1.LeafName 
  WHEN DATALENGTH(t1.LeafName) = 0 THEN t1.DirName 
  ELSE t1.DirName + N'/' + t1.LeafName 
 END  AS c11, 
 UserData.[tp_ContentTypeId], 
 UserData.[nvarchar4], 
 UserData.[tp_CheckoutUserId], 
 t2.[nvarchar6] AS c31c6, 
 t3.[nvarchar1] AS c32c3, 
 UserData.[tp_ModerationStatus], 
 UserData.[tp_Level], 
 t1.[ScopeId] AS c17, 
 t1.[Type] AS c8, 
 t1.[LeafName] AS c1, 
 t2.[nvarchar1] AS c31c3, 
 t2.[nvarchar4] AS c31c5, 
 t1.[IsCheckoutToLocal] AS c12, 
 UserData.[tp_Editor], 
 t3.[tp_Created] AS c32c7, 
 t1.[SortBehavior] AS c14, 
 t2.[tp_Created] AS c31c7, 
 t3.[tp_ID] AS c32c4, 
 UserData.[tp_Modified], 
 UserData.[nvarchar3], 
 t2.[tp_ID] AS c31c4, 
 t3.[nvarchar6] AS c32c6, 
 UserData.[tp_ID], 
 t1.[LTCheckoutUserId] AS c21, 
 t3.[nvarchar4] AS c32c5 
FROM UserData 
INNER MERGE 
 JOIN Docs AS t1 WITH(NOLOCK) ON (UserData.[tp_RowOrdinal] = 0) 
  AND (t1.SiteId=UserData.tp_SiteId) 
  AND (t1.SiteId = @SITEID) 
  AND (t1.ParentId = UserData.tp_ParentId) 
  AND (t1.Id = UserData.tp_DocId) 
  AND ( 
   (UserData.tp_Level = 1 OR  UserData.tp_Level =255) 
  ) 
  AND (t1.Level = UserData.tp_Level) 
  AND (
   (UserData.tp_Level = 255 AND t1.LTCheckoutUserId =@IU OR 
   (UserData.tp_Level = 1 AND 
    (UserData.tp_DraftOwnerId IS NULL) 
    OR UserData.tp_Level = 2)
    AND (t1.LTCheckoutUserId IS NULL 
    OR t1.LTCheckoutUserId &amp;lt;&amp;gt; @IU )
   )
  ) 
LEFT OUTER 
 LOOP JOIN AllUserData AS t2 WITH(NOLOCK,INDEX=AllUserData_PK) ON (UserData.[tp_CheckoutUserId]=t2.[tp_ID]) 
   AND (UserData.[tp_RowOrdinal] = 0) 
   AND (t2.[tp_RowOrdinal] = 0) 
   AND ( (t2.tp_Level = 1) ) 
   AND (t2.[tp_IsCurrentVersion] = CONVERT(bit,1) ) 
   AND (t2.[tp_CalculatedVersion] = 0 ) 
   AND (t2.[tp_DeleteTransactionId] = 0x ) 
   AND (t2.tp_ListId = @L3) 
   AND (UserData.tp_ListId = @L4) 
LEFT OUTER 
 LOOP JOIN AllUserData AS t3 WITH(NOLOCK,INDEX=AllUserData_PK) ON (UserData.[tp_Editor]=t3.[tp_ID]) 
   AND (UserData.[tp_RowOrdinal] = 0) 
   AND (t3.[tp_RowOrdinal] = 0) 
   AND ( (t3.tp_Level = 1) ) 
   AND (t3.[tp_IsCurrentVersion] = CONVERT(bit,1) ) 
   AND (t3.[tp_CalculatedVersion] = 0 ) 
   AND (t3.[tp_DeleteTransactionId] = 0x ) 
   AND (t3.tp_ListId = @L3) 
   AND (UserData.tp_ListId = @L4) 
WHERE (
 (UserData.tp_Level = 1 OR  UserData.tp_Level =255)  
  AND ( 
   UserData.tp_Level= 255 
   AND UserData.tp_CheckoutUserId = @IU 
   OR  ( 
    UserData.tp_Level  = 2 
    AND UserData.tp_DraftOwnerId IS NOT NULL OR UserData.tp_Level  = 1 
    AND UserData.tp_DraftOwnerId IS  NULL 
   ) 
   AND 
   ( 
    UserData.tp_CheckoutUserId IS  NULL  
    OR UserData.tp_CheckoutUserId &amp;lt;&amp;gt; @IU
   )
  )
 ) 
 AND (
  UserData.tp_SiteId=@SITEID AND 
  (
   UserData.tp_ParentId=@DocParentIdForRF
  )
 ) 
 AND (
  UserData.tp_RowOrdinal=0
 ) 
 AND (
  t1.SiteId=@SITEID 
  AND (t1.ParentId=@DocParentIdForRF)
 ) 
ORDER BY 
 t1.[SortBehavior]  DESC ,
 t1.[LeafName]  ASC ,
 UserData.[tp_ID]  ASC  
OPTION (FORCE ORDER, MAXDOP 1)


   CommandType: Text CommandTimeout: 0
   Parameter: '@LFFP' Type: UniqueIdentifier Size: 0 Direction: Input Value: '00000000-0000-0000-0000-000000000000'
   Parameter: '@SITEID' Type: UniqueIdentifier Size: 0 Direction: Input Value: '5fd1bd21-1398-49ad-9b23-2dc31243a1ba'
   Parameter: '@IU' Type: Int Size: 0 Direction: Input Value: '1'
   Parameter: '@L3' Type: UniqueIdentifier Size: 0 Direction: Input Value: '92d21d45-2844-47df-8faf-744f7eca7434'
   Parameter: '@L4' Type: UniqueIdentifier Size: 0 Direction: Input Value: 'fb66871c-599e-464a-b67f-597f884e06ef'
   Parameter: '@FDN' Type: NVarChar Size: 4000 Direction: Input Value: ''
   Parameter: '@FLN' Type: NVarChar Size: 4000 Direction: Input Value: 'Shared Documents'
   Parameter: '@NUMROWS' Type: BigInt Size: 0 Direction: Input Value: '16'
   Parameter: '@RequestGuid' Type: UniqueIdentifier Size: 0 Direction: Input Value: 'fcaec8c6-a13e-407b-9983-87e0f23fd133'
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
That's a lotta code!&lt;br /&gt;
&lt;br /&gt;
I'm not going to go through every single line, but to try to explain various groups, and infer what I think is going on with this query, and why it needs to be so complex.&lt;br /&gt;
&lt;br /&gt;
The first line, which is what you see as the clickable link in the developer dashboard creates a SQL variable called DocParentRefForRF with a data type of uniqueidentifier, which is obviously a GUID.&lt;br /&gt;
&lt;br /&gt;
There is then a query which sets this value to the GUID which identifies the particular list item we have open (in this case, default.aspx within the SitePages library). (As a bonus hint, compare this little query to when we look at this when we have a list full of unique item permissions! Also, see my other blog post on that topic).&lt;br /&gt;
&lt;br /&gt;
The next query is pretty huge, and has a row limiter, shown by the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;TOP(@NUMROWS)&lt;/span&gt;part. This at first glance might make you think that this is the List View Threshold in action. It's not. If you look at the bottom of the query, you see the parameters which have been passed into this query, in this case is 16. We'll figure out what this means later.&lt;br /&gt;
&lt;br /&gt;
Let's have a try at figuring out what data is attempted to be brought back in this query.&lt;br /&gt;
&lt;br /&gt;
A timestamp for the file (c0), the site-relative path to the current file in question (c11), the content type ID, some custom field (nvarchar4), the user that the file is checked out to, a couple more user added fields (c31c6, c32c3), the approval state of the item (tp_ModerationStatus), the publishing status of the item (Level), a reference to the permission levels for this file (ScopeId as c17), a Type (this is a flag which just says if the item is a file or a folder, c8), the filename (c1), a couple more user added fields (c31c3, c31c5), a flag indicating whether the file is checked out to the local drafts folder (c12), the person who edited the file last, the Created field (c23c7), SortBehaviour(?) (c14), another Created field (c31c7), an Item ID (c32c4), the Modified date, yet another custom added field (nvarchar3), and a couple of other Item IDs and and custom fields.&lt;br /&gt;
&lt;br /&gt;
You'll see that the table selectors for these fields within this Select statement come from 4 different tables - UserData, t1(Docs), t2 (AllUserData) and t3 (AllUserData). You'll notice there are two references to AllUserData, and one to UserData. Basically, UserData is a View provided for backwards compatibility, and just points to AllUserData. I haven't a clue if this view is cached for performance reasons (it probably isn't), and I can't confirm because my current CloudShare environmetn doesn't have SQL Server Management Studio installed.&lt;br /&gt;
&lt;br /&gt;
What's important to note is that (All)UserData contains all the custom fields which relate to a list item. These are the fields that store anything which you can select in a view in the web interface (generally). (All)Docs stores all the metadata associated with a particular item. Stuff like Checked out status, version details, the actual URL to the item.&lt;br /&gt;
&lt;br /&gt;
So now we know what kind of data is coming back from what tables. Let's try next to decipher the joins. Note that the joins are all merged into a single inner join.&lt;br /&gt;
&lt;br /&gt;
The first join binds the Docs view (AllDocs table) to the UserData view, simply matching up the &amp;nbsp;current item selected from both tables to produce a full picture of the item in question.&lt;br /&gt;
&lt;br /&gt;
The next two outer loop joins act as secondary UserData (custom fields) bindings. They are almost identical except for the join clause which binds the person who last edited the file and who the file is currently checked out to (remember this is an outer join so it includes these rows in the result set if the result is null, which would be the case if the file is not checked out, making the CheckOutUserId field blank). The purpose of these joins appears to ensure that the most recent version of the item is retrieve.&lt;br /&gt;
&lt;br /&gt;
The next part of the query is the Where section. This basically ensures that if you are the editor of the file, then you can see the draft version, otherwise you will only see the most recent published version. Here we can also see a couple of references to the DocParentRefForRF variable declared earlier. This makes sure you have permission to view the current publishing state of the item.&lt;br /&gt;
&lt;br /&gt;
Finally we've got a couple of sorting operations to help things once the result set comes back to the COM object that made the call.&lt;br /&gt;
&lt;br /&gt;
And that's it. The Item Limit, as it turns out, as actually what is defined for the default view for the web part. Go into the Edit Web Part pane, edit the current view and you'll see that the time limit is set to '15'. I guess it throws another one in for luck, or to account for null return values or something.&lt;br /&gt;
&lt;br /&gt;
Hope you found this geek fest into what a SharePoint query looks like. Might do another one in future. Maybe for a query against a list that has many fields added, just to see what it looks like.&lt;br /&gt;
&lt;br /&gt;
For reference, have a look at these early schema details of the AllUserData and AllDocs tables:&lt;br /&gt;
&lt;br /&gt;
AllUserData -&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/dd358229(v=prot.13).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd358229(v=prot.13).aspx&lt;/a&gt;&lt;br /&gt;
AllDocs -&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/dd304112(v=prot.13).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd304112(v=prot.13).aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here's also a glossary of terms used within the tables, for further reference:&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/c6244ace-4199-450d-a215-d37fa591159d(v=PROT.13)"&gt;http://msdn.microsoft.com/en-us/library/c6244ace-4199-450d-a215-d37fa591159d(v=PROT.13)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
(Btw, I do like that prot.13 version number added to these files. Obviously early documentation and prototype documentation for SharePoint 2010 (at the time, version 13 before it was changed to 14 at Beta).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-942095883759458645?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FlgcqFjiLEX4Nqdf602NmZkHT4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FlgcqFjiLEX4Nqdf602NmZkHT4A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FlgcqFjiLEX4Nqdf602NmZkHT4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FlgcqFjiLEX4Nqdf602NmZkHT4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/-XLNtTHm5WU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/942095883759458645/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=942095883759458645" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/942095883759458645?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/942095883759458645?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/-XLNtTHm5WU/closer-look-at-sharepoint-sql-query.html" title="A Closer Look at a SharePoint SQL Query using the Developer Dashboard" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/closer-look-at-sharepoint-sql-query.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cARXkzeyp7ImA9WhdbE04.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-8952977077474639127</id><published>2011-10-11T09:28:00.000+01:00</published><updated>2011-10-11T12:04:04.783+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T12:04:04.783+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title>Get MySite Host with jQuery</title><content type="html">Here's a little snippet of code to grab the MySite host of the current environment using jQuery to pick it out from the user's Welcome Menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;var str = $('#ID_MySiteMenu').attr('onMenuClick');
var myHost = str.substring(str.indexOf('http://'),str.length-2);
alert(myHost);
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Nice and simple!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-8952977077474639127?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6RbvKB-YLwdvnRLEt0rjbE88c08/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6RbvKB-YLwdvnRLEt0rjbE88c08/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6RbvKB-YLwdvnRLEt0rjbE88c08/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6RbvKB-YLwdvnRLEt0rjbE88c08/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/2Ck5eosDweY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/8952977077474639127/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=8952977077474639127" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/8952977077474639127?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/8952977077474639127?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/2Ck5eosDweY/get-mysite-host-with-jquery.html" title="Get MySite Host with jQuery" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/get-mysite-host-with-jquery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08BQn44fyp7ImA9WhdbEEQ.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-519842664820884383</id><published>2011-10-08T16:59:00.002+01:00</published><updated>2011-10-08T18:44:13.037+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-08T18:44:13.037+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><title>List Item Performance - Wide Lists and Lookups</title><content type="html">&lt;i&gt;Disclaimer:&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;The examples shown in this post are extremely unrealistic in terms of real-life scenarios. The numbers and types of fields used in these experiments are designed purely to test the physical limitations of SharePoint. At no point is it suggested that a real-life use of such list architecture be used. If you do have lists this wide and are wondering why it is slow, remove the nutmeg from your coffee and learn how to design actually usable schemas. :)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
As part of my ongoing adventures into how to make SharePoint fall over I decided to take a look at how wide Lists can be (in terms of number of fields) before performance really takes a nosedive. I set up a little test console application that uses a helper class that takes two numbers, one for the number of rows to create and a second number for the number of fields to create. The application then deletes the test List if it already exists, creates a new one, creates the specified number of fields then continues to create the specified number of items, populating all the fields for each one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At first, I did this with simple Text fields, and the tests faired pretty well. After keeping folks updated with my proceedings, &lt;a href="http://twitter.com/#!/nellymo"&gt;Neil Hodgkinson&lt;/a&gt; reminded me that it's lookup fields that really caned performance. So I modified the app ever so slightly to create lookup list columns instead. The lookup columns are set up to look at the Title field of the same list, and when populating the new items, I set the lookup value to the previous item in the list to the one just added. Confused? I'm just creating lots of fields and lots of items and timing how long it takes to do so.&lt;br /&gt;
&lt;br /&gt;
I scripted the application so I could run it with increasing numbers of fields, then I was able to chart the performance hit as the number of fields grew. See the results below, and also the source code to the application I used. The code isn't exactly ideal at the moment to be a true, flexible performance stress testing application, but it sufficed to create the tests and time how long it took to populate them.&lt;br /&gt;
&lt;br /&gt;
Whilst performing these test, I came across a similar blog post from a few years back, when SharePoint 2007 was still in beta. This post kinda brings these findings up to date, as well as testing with Lookup fields (the original post only tested Text Fields, and lots of them!). Read this post here:&amp;nbsp;&lt;a href="http://www.sharepoint-tips.com/2006/06/sharepoint-2007-column-limits.html"&gt;http://www.sharepoint-tips.com/2006/06/sharepoint-2007-column-limits.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The Results&lt;br /&gt;
&lt;br /&gt;
For each test I ran, I chose a fixed number of fields that would help in contribute to the stress test such that the number of fields created in each turn could show a perceived reduction in performance. The tables below show the number of items created and the fields created in each iteration. The timings shown firstly show the time for the entire operation in minutes, secondly the average time to create each list item in minutes, and finally a 'delta' which shows the difference in time (seconds) since the previous test iteration.&lt;br /&gt;
&lt;br /&gt;
When graphing the results, I am taking the number of fields as the X axis along the bottom, and the time taken on average to create each item as the Y axis. This allows to show a progression in performance reduction as the number of fields increases, and hopefully points to a 'kill point' at which performance reduces exponentially.&lt;br /&gt;
&lt;br /&gt;
Text Only Fields&lt;br /&gt;
&lt;br /&gt;
I decided to create 1000 list items on each iteration, with each adding 10 more fields. The following table shows the results:&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 530px;"&gt;

 &lt;colgroup&gt;&lt;col style="mso-width-alt: 3626; mso-width-source: userset; width: 85pt;" width="85"&gt;&lt;/col&gt;
 &lt;col style="mso-width-alt: 3413; mso-width-source: userset; width: 80pt;" width="80"&gt;&lt;/col&gt;
 &lt;col style="mso-width-alt: 2517; mso-width-source: userset; width: 59pt;" width="59"&gt;&lt;/col&gt;
 &lt;col style="mso-width-alt: 3498; mso-width-source: userset; width: 82pt;" width="82"&gt;&lt;/col&gt;
 &lt;col style="mso-width-alt: 5376; mso-width-source: userset; width: 126pt;" width="126"&gt;&lt;/col&gt;
 &lt;col style="mso-width-alt: 4181; mso-width-source: userset; width: 98pt;" width="98"&gt;&lt;/col&gt;
 &lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt; width: 85pt;" width="85"&gt;Operation&lt;/td&gt;
  &lt;td style="width: 80pt;" width="80"&gt;Item Count&lt;/td&gt;
  &lt;td style="width: 59pt;" width="59"&gt;Fields&lt;/td&gt;
  &lt;td style="width: 82pt;" width="82"&gt;Time (Minutes)&lt;/td&gt;
  &lt;td style="width: 126pt;" width="126"&gt;Time Per Item (Seconds)&lt;/td&gt;
  &lt;td style="width: 98pt;" width="98"&gt;Delta Overall Time&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;11&lt;/td&gt;
  &lt;td align="right"&gt;0.167&lt;/td&gt;
  &lt;td align="right"&gt;0.01002&lt;/td&gt;
  &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;21&lt;/td&gt;
  &lt;td align="right"&gt;0.22&lt;/td&gt;
  &lt;td align="right"&gt;0.0132&lt;/td&gt;
  &lt;td align="right"&gt;0.053&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;31&lt;/td&gt;
  &lt;td align="right"&gt;0.296&lt;/td&gt;
  &lt;td align="right"&gt;0.01776&lt;/td&gt;
  &lt;td align="right"&gt;0.076&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;41&lt;/td&gt;
  &lt;td align="right"&gt;0.253&lt;/td&gt;
  &lt;td align="right"&gt;0.01518&lt;/td&gt;
  &lt;td align="right"&gt;-0.043&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;51&lt;/td&gt;
  &lt;td align="right"&gt;0.27&lt;/td&gt;
  &lt;td align="right"&gt;0.0162&lt;/td&gt;
  &lt;td align="right"&gt;0.017&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;61&lt;/td&gt;
  &lt;td align="right"&gt;0.281&lt;/td&gt;
  &lt;td align="right"&gt;0.01686&lt;/td&gt;
  &lt;td align="right"&gt;0.011&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;71&lt;/td&gt;
  &lt;td align="right"&gt;0.335&lt;/td&gt;
  &lt;td align="right"&gt;0.0201&lt;/td&gt;
  &lt;td align="right"&gt;0.054&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;81&lt;/td&gt;
  &lt;td align="right"&gt;0.368&lt;/td&gt;
  &lt;td align="right"&gt;0.02208&lt;/td&gt;
  &lt;td align="right"&gt;0.033&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;91&lt;/td&gt;
  &lt;td align="right"&gt;0.378&lt;/td&gt;
  &lt;td align="right"&gt;0.02268&lt;/td&gt;
  &lt;td align="right"&gt;0.01&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;101&lt;/td&gt;
  &lt;td align="right"&gt;0.383&lt;/td&gt;
  &lt;td align="right"&gt;0.02298&lt;/td&gt;
  &lt;td align="right"&gt;0.005&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;111&lt;/td&gt;
  &lt;td align="right"&gt;0.419&lt;/td&gt;
  &lt;td align="right"&gt;0.02514&lt;/td&gt;
  &lt;td align="right"&gt;0.036&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;121&lt;/td&gt;
  &lt;td align="right"&gt;0.449&lt;/td&gt;
  &lt;td align="right"&gt;0.02694&lt;/td&gt;
  &lt;td align="right"&gt;0.03&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;131&lt;/td&gt;
  &lt;td align="right"&gt;0.498&lt;/td&gt;
  &lt;td align="right"&gt;0.02988&lt;/td&gt;
  &lt;td align="right"&gt;0.049&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;141&lt;/td&gt;
  &lt;td align="right"&gt;0.511&lt;/td&gt;
  &lt;td align="right"&gt;0.03066&lt;/td&gt;
  &lt;td align="right"&gt;0.013&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;151&lt;/td&gt;
  &lt;td align="right"&gt;0.524&lt;/td&gt;
  &lt;td align="right"&gt;0.03144&lt;/td&gt;
  &lt;td align="right"&gt;0.013&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;161&lt;/td&gt;
  &lt;td align="right"&gt;0.595&lt;/td&gt;
  &lt;td align="right"&gt;0.0357&lt;/td&gt;
  &lt;td align="right"&gt;0.071&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;171&lt;/td&gt;
  &lt;td align="right"&gt;0.58&lt;/td&gt;
  &lt;td align="right"&gt;0.0348&lt;/td&gt;
  &lt;td align="right"&gt;-0.015&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;181&lt;/td&gt;
  &lt;td align="right"&gt;0.588&lt;/td&gt;
  &lt;td align="right"&gt;0.03528&lt;/td&gt;
  &lt;td align="right"&gt;0.008&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;191&lt;/td&gt;
  &lt;td align="right"&gt;0.621&lt;/td&gt;
  &lt;td align="right"&gt;0.03726&lt;/td&gt;
  &lt;td align="right"&gt;0.033&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td align="right"&gt;1000&lt;/td&gt;
  &lt;td align="right"&gt;201&lt;/td&gt;
  &lt;td align="right"&gt;0.7&lt;/td&gt;
  &lt;td align="right"&gt;0.042&lt;/td&gt;
  &lt;td align="right"&gt;0.079&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
And here is the graph:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-D4WgEZ-6T64/TpBlsleDPbI/AAAAAAAAHTk/F9CxvJYTj1c/s1600/TextFieldsGraph.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://3.bp.blogspot.com/-D4WgEZ-6T64/TpBlsleDPbI/AAAAAAAAHTk/F9CxvJYTj1c/s320/TextFieldsGraph.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This graph shows a steady increase the time to create each item as the number of fields increases. Nothing really out of the ordinary here, though if you have 200 text fields in a list I'd love to see your user interface...&lt;br /&gt;
&lt;br /&gt;
Lookup Fields - Shorter Lists&lt;br /&gt;
&lt;br /&gt;
After being pointed out to the fact that Lookups really degrade performance I decided to go all out. This &amp;nbsp;first test tries out a relatively 'short' list with 100 items, but increasing in Lookup fields by 5 each time. Obvious, as the list grows, the performance of the lookup degrades as there are more items in the lookup field, so the average time per item shows as an average across the entire test run. At least that is the assumption. See the second test for a challenge to that.&lt;br /&gt;
&lt;br /&gt;
Here's the table for the first test:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 395px;"&gt;

 &lt;colgroup&gt;&lt;col style="mso-width-alt: 2986; mso-width-source: userset; width: 70pt;" width="70"&gt;&lt;/col&gt;
 &lt;col span="5" style="width: 65pt;" width="65"&gt;&lt;/col&gt;
 &lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt; width: 70pt;" width="70"&gt;Operation&lt;/td&gt;
  &lt;td style="width: 65pt;" width="65"&gt;Item Count&lt;/td&gt;
  &lt;td style="width: 65pt;" width="65"&gt;Fields&lt;/td&gt;
  &lt;td style="width: 65pt;" width="65"&gt;Time (Minutes)&lt;/td&gt;
  &lt;td style="width: 65pt;" width="65"&gt;Time Per Item (Seconds)&lt;/td&gt;
  &lt;td style="width: 65pt;" width="65"&gt;Delta Overall Time&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;5&lt;/td&gt;
  &lt;td class="xl63"&gt;0.031&lt;/td&gt;
  &lt;td class="xl63"&gt;0.0186&lt;/td&gt;
  &lt;td class="xl63"&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;10&lt;/td&gt;
  &lt;td class="xl63"&gt;0.034&lt;/td&gt;
  &lt;td class="xl63"&gt;0.0204&lt;/td&gt;
  &lt;td class="xl63"&gt;0.003&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;15&lt;/td&gt;
  &lt;td class="xl63"&gt;0.035&lt;/td&gt;
  &lt;td class="xl63"&gt;0.021&lt;/td&gt;
  &lt;td class="xl63"&gt;0.001&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;20&lt;/td&gt;
  &lt;td class="xl63"&gt;0.04&lt;/td&gt;
  &lt;td class="xl63"&gt;0.024&lt;/td&gt;
  &lt;td class="xl63"&gt;0.005&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;25&lt;/td&gt;
  &lt;td class="xl63"&gt;0.636&lt;/td&gt;
  &lt;td class="xl63"&gt;0.3816&lt;/td&gt;
  &lt;td class="xl63"&gt;0.596&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;30&lt;/td&gt;
  &lt;td class="xl63"&gt;1.7&lt;/td&gt;
  &lt;td class="xl63"&gt;1.02&lt;/td&gt;
  &lt;td class="xl63"&gt;1.064&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;35&lt;/td&gt;
  &lt;td class="xl63"&gt;2.209&lt;/td&gt;
  &lt;td class="xl63"&gt;1.3254&lt;/td&gt;
  &lt;td class="xl63"&gt;0.509&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;40&lt;/td&gt;
  &lt;td class="xl63"&gt;3.17&lt;/td&gt;
  &lt;td class="xl63"&gt;1.902&lt;/td&gt;
  &lt;td class="xl63"&gt;0.961&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;45&lt;/td&gt;
  &lt;td class="xl63"&gt;3.737&lt;/td&gt;
  &lt;td class="xl63"&gt;2.2422&lt;/td&gt;
  &lt;td class="xl63"&gt;0.567&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;50&lt;/td&gt;
  &lt;td class="xl63"&gt;4.835&lt;/td&gt;
  &lt;td class="xl63"&gt;2.901&lt;/td&gt;
  &lt;td class="xl63"&gt;1.098&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;55&lt;/td&gt;
  &lt;td class="xl63"&gt;6.268&lt;/td&gt;
  &lt;td class="xl63"&gt;3.7608&lt;/td&gt;
  &lt;td class="xl63"&gt;1.433&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;60&lt;/td&gt;
  &lt;td class="xl63"&gt;8.459&lt;/td&gt;
  &lt;td class="xl63"&gt;5.0754&lt;/td&gt;
  &lt;td class="xl63"&gt;2.191&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;65&lt;/td&gt;
  &lt;td class="xl63"&gt;10.818&lt;/td&gt;
  &lt;td class="xl63"&gt;6.4908&lt;/td&gt;
  &lt;td class="xl63"&gt;2.359&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;100&lt;/td&gt;
  &lt;td class="xl63"&gt;70&lt;/td&gt;
  &lt;td class="xl63"&gt;12.525&lt;/td&gt;
  &lt;td class="xl63"&gt;7.515&lt;/td&gt;
  &lt;td class="xl63"&gt;1.707&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
And here's the graph:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-yZQpiAPlZAI/TpBnvyRazzI/AAAAAAAAHTo/UhRIhcqsLdc/s1600/LookupFields1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://4.bp.blogspot.com/-yZQpiAPlZAI/TpBnvyRazzI/AAAAAAAAHTo/UhRIhcqsLdc/s320/LookupFields1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The first few test runs, up to 20 lookup fields didn't show much of a reduction at all, but performance soon started to take a hit from 25 fields, and getting exponentially worse from 50 fields and up, where it's taking nearly 3 seconds to create every single item!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lookup Fields - Longer Lists&lt;br /&gt;
&lt;br /&gt;
For the second test with Lookup Fields, I decided to see what would happen with 'longer' lists, that had 500 items. This is under the assumption that a lookup field's performance degrades as the list upon which the lookup operates gets longer.&lt;br /&gt;
&lt;br /&gt;
Here's the results:&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 395px;"&gt;

 &lt;colgroup&gt;&lt;col style="mso-width-alt: 2986; mso-width-source: userset; width: 70pt;" width="70"&gt;&lt;/col&gt;
 &lt;col span="5" style="width: 65pt;" width="65"&gt;&lt;/col&gt;
 &lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt; width: 70pt;" width="70"&gt;Operation&lt;/td&gt;
  &lt;td class="xl63" style="width: 65pt;" width="65"&gt;Item Count&lt;/td&gt;
  &lt;td class="xl63" style="width: 65pt;" width="65"&gt;Fields&lt;/td&gt;
  &lt;td class="xl63" style="width: 65pt;" width="65"&gt;Time (Minutes)&lt;/td&gt;
  &lt;td class="xl63" style="width: 65pt;" width="65"&gt;Time Per Item (Seconds)&lt;/td&gt;
  &lt;td class="xl63" style="width: 65pt;" width="65"&gt;Delta Overall Time&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;1&lt;/td&gt;
  &lt;td class="xl63"&gt;0.397&lt;/td&gt;
  &lt;td class="xl63"&gt;0.04764&lt;/td&gt;
  &lt;td class="xl63"&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;2&lt;/td&gt;
  &lt;td class="xl63"&gt;0.469&lt;/td&gt;
  &lt;td class="xl63"&gt;0.05628&lt;/td&gt;
  &lt;td class="xl63"&gt;0.072&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;3&lt;/td&gt;
  &lt;td class="xl63"&gt;0.536&lt;/td&gt;
  &lt;td class="xl63"&gt;0.06432&lt;/td&gt;
  &lt;td class="xl63"&gt;0.067&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;4&lt;/td&gt;
  &lt;td class="xl63"&gt;0.624&lt;/td&gt;
  &lt;td class="xl63"&gt;0.07488&lt;/td&gt;
  &lt;td class="xl63"&gt;0.088&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;5&lt;/td&gt;
  &lt;td class="xl63"&gt;0.745&lt;/td&gt;
  &lt;td class="xl63"&gt;0.0894&lt;/td&gt;
  &lt;td class="xl63"&gt;0.121&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;6&lt;/td&gt;
  &lt;td class="xl63"&gt;0.823&lt;/td&gt;
  &lt;td class="xl63"&gt;0.09876&lt;/td&gt;
  &lt;td class="xl63"&gt;0.078&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;7&lt;/td&gt;
  &lt;td class="xl63"&gt;0.919&lt;/td&gt;
  &lt;td class="xl63"&gt;0.11028&lt;/td&gt;
  &lt;td class="xl63"&gt;0.096&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;8&lt;/td&gt;
  &lt;td class="xl63"&gt;1.013&lt;/td&gt;
  &lt;td class="xl63"&gt;0.12156&lt;/td&gt;
  &lt;td class="xl63"&gt;0.094&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;9&lt;/td&gt;
  &lt;td class="xl63"&gt;1.138&lt;/td&gt;
  &lt;td class="xl63"&gt;0.13656&lt;/td&gt;
  &lt;td class="xl63"&gt;0.125&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;10&lt;/td&gt;
  &lt;td class="xl63"&gt;1.369&lt;/td&gt;
  &lt;td class="xl63"&gt;0.16428&lt;/td&gt;
  &lt;td class="xl63"&gt;0.231&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;11&lt;/td&gt;
  &lt;td class="xl63"&gt;1.455&lt;/td&gt;
  &lt;td class="xl63"&gt;0.1746&lt;/td&gt;
  &lt;td class="xl63"&gt;0.086&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;12&lt;/td&gt;
  &lt;td class="xl63"&gt;1.586&lt;/td&gt;
  &lt;td class="xl63"&gt;0.19032&lt;/td&gt;
  &lt;td class="xl63"&gt;0.131&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;13&lt;/td&gt;
  &lt;td class="xl63"&gt;2.442&lt;/td&gt;
  &lt;td class="xl63"&gt;0.29304&lt;/td&gt;
  &lt;td class="xl63"&gt;0.856&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;14&lt;/td&gt;
  &lt;td class="xl63"&gt;1.981&lt;/td&gt;
  &lt;td class="xl63"&gt;0.23772&lt;/td&gt;
  &lt;td class="xl63"&gt;-0.461&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;15&lt;/td&gt;
  &lt;td class="xl63"&gt;2.222&lt;/td&gt;
  &lt;td class="xl63"&gt;0.26664&lt;/td&gt;
  &lt;td class="xl63"&gt;0.241&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;16&lt;/td&gt;
  &lt;td class="xl63"&gt;2.405&lt;/td&gt;
  &lt;td class="xl63"&gt;0.2886&lt;/td&gt;
  &lt;td class="xl63"&gt;0.183&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;17&lt;/td&gt;
  &lt;td class="xl63"&gt;3.375&lt;/td&gt;
  &lt;td class="xl63"&gt;0.405&lt;/td&gt;
  &lt;td class="xl63"&gt;0.97&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;18&lt;/td&gt;
  &lt;td class="xl63"&gt;3.127&lt;/td&gt;
  &lt;td class="xl63"&gt;0.37524&lt;/td&gt;
  &lt;td class="xl63"&gt;-0.248&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;19&lt;/td&gt;
  &lt;td class="xl63"&gt;3.43&lt;/td&gt;
  &lt;td class="xl63"&gt;0.4116&lt;/td&gt;
  &lt;td class="xl63"&gt;0.303&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr height="15" style="height: 15.0pt;"&gt;
  &lt;td class="xl63" height="15" style="height: 15.0pt;"&gt;Create Items&lt;/td&gt;
  &lt;td class="xl63"&gt;500&lt;/td&gt;
  &lt;td class="xl63"&gt;20&lt;/td&gt;
  &lt;td class="xl63"&gt;4.067&lt;/td&gt;
  &lt;td class="xl63"&gt;0.48804&lt;/td&gt;
  &lt;td class="xl63"&gt;0.637&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
And the graph:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-BiIQ5w9O3gQ/TpBxNhj7nII/AAAAAAAAHTs/M4D9MmRNask/s1600/LookupFields2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://4.bp.blogspot.com/-BiIQ5w9O3gQ/TpBxNhj7nII/AAAAAAAAHTs/M4D9MmRNask/s320/LookupFields2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This graph shows a steadily decreasing reduction in performance (disregarding the two anomalies). The thing to note here (apart form the trend towards an eventual exponential trend in performance reduction), is that 15 fields with 500 items is timed at 0.26664 seconds per item. The same width-list with 100 items came in at 0.021.&lt;br /&gt;
&lt;br /&gt;
This mean a list with 15 lookup fields that looks up to 500 items is 10x slower than looking up to a list with only 100 items.&lt;br /&gt;
&lt;br /&gt;
Let's compare to 20 lookup fields. Time of 0.48804 seconds per item with 500 items compared to 0.024 seconds per item when populating 100 items. This makes lookups to 500 items over 20x slower than with 100 items. Proving the fact that more items, coupled with more lookup fields, leads to far, far slower performance when creating and updating list items.&lt;br /&gt;
&lt;br /&gt;
Stating the absolute obvious? Most definitely, but at least now you can see some numbers proving it :)&lt;br /&gt;
&lt;br /&gt;
Addendum - Source Code&lt;br /&gt;
&lt;br /&gt;
Here's the source code for my helper class and console application to create the lists and the list items. By the time I was scripting this application I had it optimised to create lookup fields, but at least you can see the process used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;

namespace PerformanceTests
{
    public class ListUpdater
    {

        public static void CreateFields(SPList list, int fieldCount)
        {
            for (int i = 0; i &amp;lt; fieldCount; i++)
            {
                list.Fields.Add("Field" + i, SPFieldType.Text, false);
            }
            list.Update();
        }

        public static void CreateLookupFields(SPList list, int fieldCount)
        {
            for (int i = 0; i &amp;lt; fieldCount; i++)
            {
                list.Fields.AddLookup("Field" + i, list.ID, false);
                SPFieldLookup lkp = (SPFieldLookup)list.Fields["Field" + i];

                lkp.LookupField = "Title";
                lkp.Update();
            }
            list.Update();
        }
       
        public static TimeSpan CreateItems(SPList list, int fieldCount, int itemCount)
        {
            SPListItem item = list.Items.Add();
            item["Title"] = "Test0";
            item.Update();

            DateTime startTime = DateTime.Now;
            for (int a = 0; a &amp;lt; itemCount; a++)
            {
                item = list.Items.Add();
                item["Title"] = "Test" + a;
                item.Update();

                for (int i = 0; i &amp;lt; fieldCount; i++)
                {
                    item["Field" + i] = a + ";#Test" + a;
                }
                //Console.WriteLine("Updating List Item " + a);
                item.Update();
            }
            return DateTime.Now - startTime;
        }

        public static TimeSpan UpdateList(SPList list, int colCount)
        {
            DateTime startTime = DateTime.Now;
            SPListItemCollection items = list.Items;

            foreach (SPListItem item in items)
            {
                for (int j = 0; j &amp;lt; colCount; j++)
                {
                    item["Field" + j] = "Test item";
                }
                item.Update();
            }
            DateTime endTime = DateTime.Now;

            return endTime - startTime;
        }


    }
}

&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
And here's the Console App:

&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;

namespace PerformanceTests
{
    class CreateAndPopulateList
    {
        static void Main(string[] args)
        {

            SPSite site = new SPSite("http://spf-dev/");
            SPWeb web = site.OpenWeb();

            SPList list = web.Lists["PerfTest"];

            list.Recycle();

            int itemCount = 0;
            int fieldCount = 0;

            Int32.TryParse(args[0], out itemCount);
            Int32.TryParse(args[1], out fieldCount);

            Console.WriteLine(string.Format("Starting Creating/Updating list {0} items with {1} fields...", itemCount, fieldCount));

            Guid listId = web.Lists.Add("PerfTest", "", SPListTemplateType.GenericList);
            list = web.Lists[listId];

           

            ListUpdater.CreateLookupFields(list, fieldCount);
            TimeSpan duration = ListUpdater.CreateItems(list, fieldCount, itemCount);

            Console.WriteLine("Done. Time Taken to create "+ fieldCount+" fields and "+itemCount+" items : " + duration.TotalMinutes);
            
        }
    }
}

&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-519842664820884383?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BFxbywXcxn7kL9bOHbera_vMcos/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BFxbywXcxn7kL9bOHbera_vMcos/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BFxbywXcxn7kL9bOHbera_vMcos/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BFxbywXcxn7kL9bOHbera_vMcos/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/LbAhu5GALyE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/519842664820884383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=519842664820884383" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/519842664820884383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/519842664820884383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/LbAhu5GALyE/list-item-performance-wide-lists-and.html" title="List Item Performance - Wide Lists and Lookups" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-D4WgEZ-6T64/TpBlsleDPbI/AAAAAAAAHTk/F9CxvJYTj1c/s72-c/TextFieldsGraph.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/list-item-performance-wide-lists-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8FSHo7eyp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-800254379780436294</id><published>2011-10-06T00:07:00.000+01:00</published><updated>2011-12-15T20:26:59.403Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T20:26:59.403Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint branding css video" /><title>Video - SharePoint Branding with CSS Customisations</title><content type="html">Here's a short presentation by myself in response to &lt;a href="http://twitter.com/#!/webdes03"&gt;Mike Greene&lt;/a&gt;'s post about&lt;a href="http://mike-greene.com/2011/10/custom-css-and-sharepoint-branding-the-right-way/"&gt; CSS in SharePoint&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It's my first, it took all evening, so enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://player.vimeo.com/video/30105108?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="640"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/30105108"&gt;SharePoint Branding with CSS Customisations&lt;/a&gt; from &lt;a href="http://vimeo.com/jimmywim"&gt;James Love&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;
Talking through what to do and what not to do when customising SharePoint sites with CSS changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-800254379780436294?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sq7TQKH6wjyGdRqf_7I7kBnJB7A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sq7TQKH6wjyGdRqf_7I7kBnJB7A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sq7TQKH6wjyGdRqf_7I7kBnJB7A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sq7TQKH6wjyGdRqf_7I7kBnJB7A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/WLfYmcK3va0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/800254379780436294/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=800254379780436294" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/800254379780436294?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/800254379780436294?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/WLfYmcK3va0/video-sharepoint-branding-with-css.html" title="Video - SharePoint Branding with CSS Customisations" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/video-sharepoint-branding-with-css.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAMSXs_fSp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-2685239378267049373</id><published>2011-10-03T18:30:00.000+01:00</published><updated>2011-12-15T20:26:28.545Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T20:26:28.545Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint client object model javascript ecmascript" /><title>Making use of the Property Bag in the ECMAScript Client Object Model</title><content type="html">This article is a cross-post of the originally published article from NothingButSharePoint.com, available here:&amp;nbsp;&lt;a href="https://www.nothingbutsharepoint.com/sites/devwiki/articles/Pages/Making-use-of-the-Property-Bag-in-the-ECMAScript-Client-Object-Model.aspx"&gt;https://www.nothingbutsharepoint.com/sites/devwiki/articles/Pages/Making-use-of-the-Property-Bag-in-the-ECMAScript-Client-Object-Model.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The “Property Bag” is a really quick and easy way to store key/value pairs that can be associated to a particular web site. You can use this to easily store settings for an application that you might want to scope to a single Website, or even an entire Site Collection (by referring to the RootWeb of the current Site Collection).
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
We can make use of this in the Javascript/ECMAScript Client Object Model of SharePoint, using the allProperties property of the web object.
&lt;br /&gt;
&lt;br /&gt;
Here is a quick example of both setting and getting a value from the property bag, using Javascript.
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;function getWebProperty() {
    var ctx = new SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    this.props =  web.get_allProperties();
    this.props.set_item(“aProperty”, “aValue”);
    ctx.load(web);

    ctx.executeQueryAsync(Function.createDelegate(this, gotProperty), Function.createDelegate(this, failedGettingProperty));
}

function gotProperty() {
    alert(this.props.get_item(“aProperty”));
}

function failedGettingProperty() {
    alert("failed");
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
When we call getWebProperty, the usual stuff of setting up the Client Context is done to get a handle on the current site. I’m also getting the RootWeb of the current site collection, so this property could be retrieved in any site within the site collection. By creating a variable called ‘props’ and setting its scope to ‘this’, I can retrieve it in my success callback.
&lt;br /&gt;
&lt;br /&gt;
As you can see, it’s simply a case of calling ‘set_item’, passing in the name of a property and the value to set, and also calling ‘get_item’, passing the name of a property, to retrieve that value.
&lt;br /&gt;
&lt;br /&gt;
The main difference between this and the server object model is that because we use traditional ‘getter’ and ‘setter’ methods (rather than Property accessors) we don’t need to trap for possible ArgumentOutOfRange exceptions in our code. If the value doesn’t exist, the method call to ‘get_item’ will return null. In this sense, to me, this makes handling the Property bag far simpler, with less code needed to write to and get from the property bag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-2685239378267049373?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G0W4V6cULqvXRRPzKgxAGeXN8c0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0W4V6cULqvXRRPzKgxAGeXN8c0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G0W4V6cULqvXRRPzKgxAGeXN8c0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0W4V6cULqvXRRPzKgxAGeXN8c0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/MdyWqYah8Qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/2685239378267049373/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=2685239378267049373" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2685239378267049373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2685239378267049373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/MdyWqYah8Qo/making-use-of-property-bag-in.html" title="Making use of the Property Bag in the ECMAScript Client Object Model" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/10/making-use-of-property-bag-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ERX4-eCp7ImA9WhRQGUU.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-932514690628179358</id><published>2011-09-27T21:41:00.002+01:00</published><updated>2011-12-15T20:26:44.050Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-15T20:26:44.050Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint ribbon fluent ui c#" /><title>Programmatically add Ribbon Custom Action to an Existing List</title><content type="html">&lt;i&gt;This is a cross-post from the original article from SharePoint365, available at:&amp;nbsp;&lt;a href="http://sp365.co.uk/2011/09/programmatically-add-ribbon-custom-action-to-an-existing-list/"&gt;http://sp365.co.uk/2011/09/programmatically-add-ribbon-custom-action-to-an-existing-list/&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
There is plenty of documentation on the web for creating Ribbon Customisations using the standard SharePoint CAML XML mark-up. This is a great dialect for creating complex customisations to the ribbon, but they only get applied on Feature Activation.&lt;br /&gt;
&lt;br /&gt;
What if you have a List in the site that already exists and you need to apply some Ribbon actions? Sure, you can add Ribbon extensions to a Content Type (and this is probably recommended), however not all of our environments that we encounter use Content Types. Or, we have Lists being created from the “Custom List” list definition (or list type) programmatically in a Feature Receiver (which is executed after all the Feature CAML has been loaded &amp;amp;amp; provisioned). Or we have lists created dynamically from Workflows, or other Event Receivers, or some other dynamic method at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This little hint will show you how to add Ribbon customisations programmatically at any time. There is still XML involved, to define the actual Ribbon buttons and the commands they execute, but this can easily be added to an existing instance of a List in a site.&lt;br /&gt;
&lt;br /&gt;
In essence, you add this XML to the SPList.CustomUIExtension property.&lt;br /&gt;
&lt;br /&gt;
Beware that this might overwrite any other Ribbon customisations applied directly to this List (if there are any added using the aforementioned Feature CAML code), and thus might remove customisations already existing. If this is the case in your environment, ensure that you don’t blindly add the code to the property without first ‘getting’ it, and carefully injecting the XML you require before ‘setting’ the property with your full XML.&lt;br /&gt;
&lt;br /&gt;
Here is an example, which gets a List that already exists in my site, and creates a link to Site Settings for a selected item in that list. Bit of a useless example, maybe, but like I said earlier, there’re other great examples of more complex and uses of Ribbon customisation. For brevity, I haven’t included an image in this either, but the examples on the web will show you how to include 32px and 16px images for your Ribbon Actions.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-2dcD55KUiEY/ToIyu4r4D1I/AAAAAAAAHSs/dVe56nRYeRY/s1600/ribboncustom.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-2dcD55KUiEY/ToIyu4r4D1I/AAAAAAAAHSs/dVe56nRYeRY/s1600/ribboncustom.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;

namespace AddRibbonAction
{
    class Program
    {
        static void Main(string[] args)
        {
            SPSite site = new SPSite("http://demolab-sps2010/");
            SPWeb web = site.OpenWeb();
            SPList list = web.Lists.TryGetList("Department Performance");

            var action = list.UserCustomActions.Add();
            action.Location = "CommandUI.Ribbon.ListView";
            action.Sequence = 85;
            action.Title = "Test Action";

           action.CommandUIExtension =&amp;nbsp;&amp;nbsp; @"&amp;lt;CommandUIExtension&amp;gt;&amp;lt;CommandUIDefinitions&amp;gt;
              &amp;lt;CommandUIDefinition Location=""Ribbon.ListItem.Actions.Controls._children""&amp;gt;
              &amp;lt;Button Id=""TestAction.Button"" TemplateAlias=""o1"" Command=""TestCommand"" CommandType=""General"" LabelText=""Settings"" /&amp;gt;
              &amp;lt;/CommandUIDefinition&amp;gt;
              &amp;lt;/CommandUIDefinitions&amp;gt;
              &amp;lt;CommandUIHandlers&amp;gt;
              &amp;lt;CommandUIHandler Command =""TestCommand"" CommandAction=""/_layouts/settings.aspx"" /&amp;gt;
              &amp;lt;/CommandUIHandlers&amp;gt;&amp;lt;/CommandUIExtension&amp;gt;";
            action.Update();

            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-932514690628179358?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tz50oaKtafv-SobirrM6eqmoNG4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tz50oaKtafv-SobirrM6eqmoNG4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tz50oaKtafv-SobirrM6eqmoNG4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tz50oaKtafv-SobirrM6eqmoNG4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/ZUntN1H22rk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/932514690628179358/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=932514690628179358" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/932514690628179358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/932514690628179358?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/ZUntN1H22rk/programmatically-add-ribbon-custom.html" title="Programmatically add Ribbon Custom Action to an Existing List" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-2dcD55KUiEY/ToIyu4r4D1I/AAAAAAAAHSs/dVe56nRYeRY/s72-c/ribboncustom.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/09/programmatically-add-ribbon-custom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkENQXozfyp7ImA9WhdbEEQ.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-1465129735419962052</id><published>2011-09-09T19:24:00.000+01:00</published><updated>2011-10-08T18:24:50.487+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-08T18:24:50.487+01:00</app:edited><title>Build a Simple Web Part for Office 365 that gets data from a List</title><content type="html">&lt;i&gt;Cross-Post. Originally posted on&amp;nbsp;&lt;a href="http://sp365.co.uk/2011/07/build-a-simple-web-part-for-office-365-that-gets-data-from-a-list/"&gt;http://sp365.co.uk/2011/07/build-a-simple-web-part-for-office-365-that-gets-data-from-a-list/&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;
In this article we will create a simple web part in C# code that will access a task list and show a list of pending items. You will then be able to upload this web part to your SharePoint environment on Office 365!&lt;br /&gt;
&lt;br /&gt;
This tutorial combines others on the internet that shows the basics of creating web parts, and the basics of interrogating lists using the SharePoint Object Model, with the final flourish of uploading our finished web part to the cloud for use.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
We’ll use Visual Studio 2010 to create the web part, and we’ll assume that you have a development environment available, be it with SharePoint Foundation installed on Windows 7 on your PC, or on a Virtual Machine.&lt;br /&gt;
First of all, open up Visual Studio 2010, and go ahead and create an Empty SharePoint Project. For this tutorial, I will use the project name “SharePoint365.WebParts”.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://sp365.co.uk/wp-content/uploads/2011/06/11.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Ensure that the URL to an existing web site on your development environment is selected in the next dialogue box, and that you are deploying as a Sandboxed Solution. The fact this web part will be deployed as a sandbox solution means you can upload the resulting package to your Office 365 environment.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="253" src="http://sp365.co.uk/wp-content/uploads/2011/06/2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Right click on the project file at the top of the Solution Explorer, select Add and click New Item.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://sp365.co.uk/wp-content/uploads/2011/06/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In the Add New Item Dialog Box, ensure that SharePoint 2010 is selected from the left hand Template and select Web Part from the list of installed templates (making sure you don’t select Visual Web Part). Give it a name, for this tutorial I’ll use OutstandingTasks.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://sp365.co.uk/wp-content/uploads/2011/06/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
When you click Add, Visual Studio will set up the project with everything you need to get started, including adding .NET Assembly references that are needed, a Feature folder for your web part, and a Package folder which contains your feature. Your web part exists in what’s known as a “SharePoint Project Item” folder, and this also includes a .webpart declaration file (which makes your web part available when you add a new web part to a page), the “.cs” source code file for your web part and an Elements.xml file, which tells SharePoint where to copy the .webpart file.&lt;br /&gt;
&lt;br /&gt;
Before we crack on and write some code, lets tidy up some names of things to make the visual aspect a bit more relevant in SharePoint itself.&lt;br /&gt;
&lt;br /&gt;
From the Solution Explorer, click the “Feature1” folder (not the Feature1.feature file), and hit F2. The folder should be highlighted to let you rename it. For this tutorial, I’ll call this “Outstanding Tasks Web Part Feature”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://sp365.co.uk/wp-content/uploads/2011/06/5.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Once renamed, hit enter, and double click this file to open the Feature Designer. Set the “Title” to the same as the name of the folder (Outstanding Tasks Web Part Feature), and ensure the “Scope” is set to “Site”. Notice your Web Part Project Item is also automatically added to the Feature.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://sp365.co.uk/wp-content/uploads/2011/06/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;
Finally, let’s make sure the web part has a relevant name when we’re adding it to a page.&lt;br /&gt;
&lt;br /&gt;
Double click the OustandingTasks.webpart file in the solution explorer.&lt;br /&gt;
&lt;br /&gt;
When it opens up, you’ll see it’s an XML file. This tells SharePoint what code to use for your web part, and also sets various properties – for here we only have Title and Description, so let’s set these to something more relevant.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://sp365.co.uk/wp-content/uploads/2011/06/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="http://sp365.co.uk/wp-content/uploads/2011/06/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Finally, we can now write some code!&lt;br /&gt;
Save and close the other windows that are open, and double click the OustandingTasks.cs file if it’s not already open.&lt;br /&gt;
Inside the CreateChildControls method, paste the following code:&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;SPList taskList = SPContext.Current.Web.Lists["Tasks"];

SPQuery query = new SPQuery();
query.Query = "&amp;lt;Where&amp;gt;&amp;lt;Neq&amp;gt;&amp;lt;FieldRef Name='Status' /&amp;gt;&amp;lt;Value Type='Text'&amp;gt;Completed&amp;lt;/Value&amp;gt;&amp;lt;/Neq&amp;gt;&amp;lt;/Where&amp;gt;";
query.ViewFields = "&amp;lt;FieldRef Name='Title' /&amp;gt;&amp;lt;FieldRef Name='Status'/&amp;gt;";

SPListItemCollection tasks = taskList.GetItems(query);

string htmlTable = "&amp;lt;table border='1'&amp;gt;";
htmlTable += "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Title&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Status&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;";

foreach (SPListItem aTask in tasks)
{
  htmlTable += string.Format("&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{0}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{1}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;", aTask["Title"], aTask["Status"]);
}

htmlTable += "&amp;lt;/table&amp;gt;";

LiteralControl tableControl = new LiteralControl(htmlTable);
this.Controls.Add(tableControl);&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Let’s go through the code and explain what’s going on.&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;SPList taskList = SPContext.Current.Web.Lists["Tasks"];&lt;/pre&gt;
Here we get an object which represents our Task list. From the right hand side we’re looking at the current website in which the web part will be placed. Inside the square brackets we’re passing in the “Internal Name” of the List (which you can see if you look at the URL whilst you’re in the list):&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-1465129735419962052?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ewHB1KHjKK7_JgdOkURJ8Ggk96s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ewHB1KHjKK7_JgdOkURJ8Ggk96s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ewHB1KHjKK7_JgdOkURJ8Ggk96s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ewHB1KHjKK7_JgdOkURJ8Ggk96s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/5ELSA4j5AEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/1465129735419962052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=1465129735419962052" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1465129735419962052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1465129735419962052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/5ELSA4j5AEU/build-simple-web-part-for-office-365.html" title="Build a Simple Web Part for Office 365 that gets data from a List" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/09/build-simple-web-part-for-office-365.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNRn47cSp7ImA9WhdXEE8.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-391104626950049020</id><published>2011-08-22T15:58:00.001+01:00</published><updated>2011-08-22T15:59:57.009+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-22T15:59:57.009+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="id-live" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><title>SharePoint Training with Intelligent Decisioning Pty</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-_u9Ba0sg2M4/TlJu4jJ7xeI/AAAAAAAAG7s/Dq60Aaec4zI/s1600/logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-_u9Ba0sg2M4/TlJu4jJ7xeI/AAAAAAAAG7s/Dq60Aaec4zI/s1600/logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Thought I'd take some time here to plug my company's newly launched training delivery branch out in Brisbane, Australia (and it's been a wee while since my last post!).&lt;br /&gt;
&lt;br /&gt;
Intelligent Decisioning Pty in Australia are now a Critical Path Training partner, have opened up several training workshops in October, delivering training materials from Critical Path Training, who are industry leaders in SharePoint Training. Critical Path Training is a joint venture by SharePoint MVP's Ted Pattinson and Andrew Connell, who deliver instructor-led training courses throughout the United States in Microsoft Training Centres.&lt;br /&gt;
&lt;br /&gt;
Managing Director of Intelligent Decisioning Pty and SharePoint Expert instructor Dr Adrian Colquhoun, will be delivering the courses from the purpose built, fantastically located offices in Raby Baby, Brisbane.&lt;br /&gt;
&lt;br /&gt;
There are 6 separate courses, for users of any aspect of using SharePoint, from 2 day End User sessions to full-on 4 day SharePoint Development and Administration courses, and everything in between!&lt;br /&gt;
&lt;br /&gt;
Check out the ID Live Australia website at&amp;nbsp;&lt;a href="http://id-live.com.au/Training.aspx"&gt;http://id-live.com.au/Training.aspx&lt;/a&gt; for more detailed information on the courses, and view the full schedule on EventBrite at:&amp;nbsp;&lt;a href="http://idlive.eventbrite.com/"&gt;http://idlive.eventbrite.com/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you are an individual working with SharePoint requiring deeper level of skills, or part of a team needing more SharePoint knowledge in eastern Australia, you'll be guaranteed world-class SharePoint Training from a world-class expert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-391104626950049020?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ecqGgTEs3aAYuRjjoUmbojg45R0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ecqGgTEs3aAYuRjjoUmbojg45R0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ecqGgTEs3aAYuRjjoUmbojg45R0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ecqGgTEs3aAYuRjjoUmbojg45R0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/5-QQgbXJyBg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/391104626950049020/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=391104626950049020" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/391104626950049020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/391104626950049020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/5-QQgbXJyBg/sharepoint-training-with-intelligent.html" title="SharePoint Training with Intelligent Decisioning Pty" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-_u9Ba0sg2M4/TlJu4jJ7xeI/AAAAAAAAG7s/Dq60Aaec4zI/s72-c/logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/08/sharepoint-training-with-intelligent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QGSHk6eCp7ImA9WhdTEU8.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-1719529345594137034</id><published>2011-07-08T11:29:00.002+01:00</published><updated>2011-07-08T11:35:29.710+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-08T11:35:29.710+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="permissions" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>Resetting Item Level Permissions Programmatically</title><content type="html">As part of my series of blog posts on item level permissions, I thought I'd post a quick note on "resetting" item-level permissions on a list.&lt;br /&gt;
&lt;br /&gt;
This can be done using the method &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.resetroleinheritance.aspx"&gt;SPListItem.ResetRoleInheritance()&lt;/a&gt; on the list item in question. This will reset any item level permissions on this item to inherit from the List in which the item resides.&lt;br /&gt;
&lt;br /&gt;
This method is part of the &lt;a href="http://msdn.microsoft.com/en-us/library/ee561705.aspx"&gt;SPSecurableObject &lt;/a&gt;class, which is inherited by Webs, Lists and Items - so anything where you can have unique permissions will inherit this class and expose methods to handle the unique&amp;nbsp;permissions&amp;nbsp;for that item.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-1719529345594137034?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/18eeHI1inF5ayDG60Kaf01edCO4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/18eeHI1inF5ayDG60Kaf01edCO4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/18eeHI1inF5ayDG60Kaf01edCO4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/18eeHI1inF5ayDG60Kaf01edCO4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/E9yoBXkdL2w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/1719529345594137034/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=1719529345594137034" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1719529345594137034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/1719529345594137034?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/E9yoBXkdL2w/resetting-item-level-permissions.html" title="Resetting Item Level Permissions Programmatically" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/07/resetting-item-level-permissions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQNSX44eip7ImA9WhZUF00.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-344512740607708189</id><published>2011-06-09T23:07:00.001+01:00</published><updated>2011-06-10T11:06:38.032+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T11:06:38.032+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="visual studio 2010" /><title>List Item Performance - Updating Large Lists</title><content type="html">As part of my series on performance, I thought I'd look at updating large (20,000 item) lists in bulk, and what are the fastest ways to do this.&lt;br /&gt;
&lt;br /&gt;
I've gone through a few different ways of doing this, finding out where the slowness is coming from, and I present the results of the analysis in this blog. Hopefully someone will take away some value from this!&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;The Control Test&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
First of all, I decided to use the worst possible method as a control for the experiement: iterating over SPList.Items. Microsoft have &lt;a href="http://msdn.microsoft.com/en-us/library/bb687949(v=office.12).aspx#WorkingWithFoldersLists"&gt;stated quite clearly &lt;/a&gt;that one should avoid doing this whereever possible, and&lt;a href="http://e-junkie-chronicles.blogspot.com/2011/04/splistitems-versus-spquery.html"&gt; I've found out myself&lt;/a&gt; that isn't not even advisable to pass in an empty SPQuery to GetItems.&lt;br /&gt;
&lt;br /&gt;
Here's the code I used to update the items with this method:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;

namespace ItemUpdatePerformance
{
    class Program
    {
        static void Main(string[] args)
        {
            SPSite site = new SPSite("http://demolab-sps2010/");
            SPWeb web = site.RootWeb;

            SPList list = web.Lists["PerfTest"];

            string startTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Starting process... - " + startTime);

            foreach (SPListItem item in list.Items)
            {
                Console.WriteLine("Updating item {0}...", item.ID);
                item["Title"] = item["Title"].ToString() + "_1";
                item.Update();
            }

            string endTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Finished process...\n Time taken: {0} - {1}", startTime, endTime);

            Console.ReadLine();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
And here's a screenshot of the result from this test:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-P4T-n20X9Uk/TfEhmCdJ5VI/AAAAAAAAG24/Ypen3lxffII/s1600/1_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="321" src="http://2.bp.blogspot.com/-P4T-n20X9Uk/TfEhmCdJ5VI/AAAAAAAAG24/Ypen3lxffII/s640/1_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
As we can see, 3 minutes 13 seconds for our control, using the "worst possible method" for both accessing and updating the list. One thing to note about this method: the delay between the output "Starting Process..." and the first "Updating Item..." was something in the order of 15 seconds. Imagine a page load delay of that long, even if you're not iterating over all the items in SPList.Items, but just setting a variable to that property! If you simply access SPList.Items, a trip is made to the content database to evaluate all the items in your query, so that when you do eventually come to iterate over the SPListItemCollection, it is somewhat more performant. Next up, the main hope is to reduce this delay, as well as trying to avoid updating each item one at a time.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Experiement 1: Batch Updating&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For the next few tests, I decided to look at the &lt;a href="http://msdn.microsoft.com/en-us/library/cc404818(v=office.12).aspx"&gt;MSDN article about Batch Updating list items&lt;/a&gt;, using the ProcessBatchCommand method of SPWeb.&lt;br /&gt;
&lt;br /&gt;
I took the code samples on their site and structured it into my solution, here's how it looks:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;
using System.Text;
using Microsoft.SharePoint.Utilities;

namespace BulkUpdate
{
    class Program
    {
        static void Main(string[] args)
        {

            SPSite site = new SPSite("http://demolab-sps2010/");
            SPWeb web = site.RootWeb;

            SPList list = web.Lists["PerfTest"];

            string startTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Starting process... - " + startTime);


            StringBuilder methodBuilder = new StringBuilder();
            string batch = string.Empty;
            DateTime currentDate = DateTime.Now;
            string formattedDate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(currentDate);

            string batchFormat = "&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt;" +
              "&amp;lt;ows:Batch OnError=\"Return\"&amp;gt;{0}&amp;lt;/ows:Batch&amp;gt;";

            string methodFormat = "&amp;lt;Method ID=\"{0}\"&amp;gt;" +
             "&amp;lt;SetList&amp;gt;{1}&amp;lt;/SetList&amp;gt;" +
             "&amp;lt;SetVar Name=\"Cmd\"&amp;gt;Save&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;SetVar Name=\"ID\"&amp;gt;{2}&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;SetVar Name=\"urn:schemas-microsoft-com:office:office#Title\"&amp;gt;{3}&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;/Method&amp;gt;";

            SPQuery query = new SPQuery();
            query.RowLimit = 200;

            int i = 0;

            do
            {
                SPListItemCollection items = list.GetItems(query);

                methodBuilder.Remove(0, methodBuilder.ToString().Length);

                foreach (SPListItem item in items)
                {
                    methodBuilder.AppendFormat(methodFormat, item.ID, list.ID.ToString(), item.ID, item["Title"] + "_4");
                }

                batch = string.Format(batchFormat, methodBuilder.ToString());

                Console.WriteLine("Sending batch {0} for processing...", i);
                web.ProcessBatchData(batch);
                i++;
                query.ListItemCollectionPosition = items.ListItemCollectionPosition;

            } while (query.ListItemCollectionPosition != null);


            string endTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Finished process...\n Time taken: {0} - {1}", startTime, endTime);

            Console.ReadLine();
        }
    }
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
And important line to look out for here is the query.RowLimit = 200; line. I change this for the next couple of experiments, to see how the size of a page I'm getting from the list varies with each update.&lt;br /&gt;
&lt;br /&gt;
Here's the screenshot from the first run, with 200 items:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zk4hsPmQOWo/TfEjhbqGwXI/AAAAAAAAG28/OlGMYQFjKR8/s1600/2_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://3.bp.blogspot.com/-zk4hsPmQOWo/TfEjhbqGwXI/AAAAAAAAG28/OlGMYQFjKR8/s640/2_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Here: 4 minutes, 39 seconds. Oh dear, even slower! Let's try a bigger batch. This time, 500 items at a time.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-iQElovroRWg/TfEj7eBqyfI/AAAAAAAAG3A/8U3kBrRP3Jo/s1600/3_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://2.bp.blogspot.com/-iQElovroRWg/TfEj7eBqyfI/AAAAAAAAG3A/8U3kBrRP3Jo/s640/3_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
This time, 3 minutes 32 seconds! Much better, bit still slower than the forbidden way!&lt;br /&gt;
&lt;br /&gt;
What happens with smaller batches? 50 items per batch this time:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gB7stD-Bwq4/TfEklmuCj0I/AAAAAAAAG3E/mLuwlmkuoU4/s1600/4_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-gB7stD-Bwq4/TfEklmuCj0I/AAAAAAAAG3E/mLuwlmkuoU4/s640/4_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Uhm, yeah. 10 minutes 53 seconds for that one. Scratch that idea.&lt;br /&gt;
&lt;br /&gt;
So it seems bigger batches are going in the right direction. Let's try the default query throttling limit of 2000 items.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-XCUtHkeJcRU/TfEl2LxgNqI/AAAAAAAAG3I/Ci0Wkh8XZPU/s1600/5_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-XCUtHkeJcRU/TfEl2LxgNqI/AAAAAAAAG3I/Ci0Wkh8XZPU/s640/5_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Whoa there, Betsy. 2 minutes 51 seconds! That's a record for us!&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Experiment 3: Data Tables&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Lastly, I want to see if I can speed up the "getting" of all the items in my list. I want to see if the GetDataTable() method of SPListItemCollection will get me the items any faster than just the Items property. At least, I want to see if I can iterate over the rows in a DataTable faster than I can the Items in the collection. I'm going to again use the Batch method with 2000 rows per time, as this got the best results yet.&lt;br /&gt;
&lt;br /&gt;
Here's the code that uses GetDataTable()&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;
using System.Text;
using Microsoft.SharePoint.Utilities;
using System.Data;

namespace BulkUpdate
{
    class Program
    {
        static void Main(string[] args)
        {

            SPSite site = new SPSite("http://demolab-sps2010/");
            SPWeb web = site.RootWeb;

            SPList list = web.Lists["PerfTest"];

            string startTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Starting process... - " + startTime);


            StringBuilder methodBuilder = new StringBuilder();
            string batch = string.Empty;
            DateTime currentDate = DateTime.Now;
            string formattedDate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(currentDate);

            string batchFormat = "&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt;" +
              "&amp;lt;ows:Batch OnError=\"Return\"&amp;gt;{0}&amp;lt;/ows:Batch&amp;gt;";

            string methodFormat = "&amp;lt;Method ID=\"{0}\"&amp;gt;" +
             "&amp;lt;SetList&amp;gt;{1}&amp;lt;/SetList&amp;gt;" +
             "&amp;lt;SetVar Name=\"Cmd\"&amp;gt;Save&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;SetVar Name=\"ID\"&amp;gt;{2}&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;SetVar Name=\"urn:schemas-microsoft-com:office:office#Title\"&amp;gt;{3}&amp;lt;/SetVar&amp;gt;" +
             "&amp;lt;/Method&amp;gt;";

            SPQuery query = new SPQuery();
            query.RowLimit = 2000;

            int i = 0;

            do
            {
                SPListItemCollection items = list.GetItems(query);
                DataTable table = list.Items.GetDataTable();

                methodBuilder.Remove(0, methodBuilder.ToString().Length);

                foreach (DataRow row in table.Rows)
                {
                    string moo = row["Title"].ToString();
                    methodBuilder.AppendFormat(methodFormat, row["ID"], list.ID.ToString(), row["ID"], row["Title"] + "_6");
                }


                batch = string.Format(batchFormat, methodBuilder.ToString());

                Console.WriteLine("Sending batch {0} for processing...", i);
                web.ProcessBatchData(batch);
                i++;
                query.ListItemCollectionPosition = items.ListItemCollectionPosition;

            } while (query.ListItemCollectionPosition != null);


            string endTime = DateTime.Now.ToLongTimeString();
            Console.WriteLine("Finished process...\n Time taken: {0} - {1}", startTime, endTime);

            Console.ReadLine();
        }
    }
}

&lt;/pre&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;And here's the results:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zVCKQM1lDTs/TfEqICRbeKI/AAAAAAAAG3M/6LqPP3Yt7bw/s1600/6_screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="384" src="http://3.bp.blogspot.com/-zVCKQM1lDTs/TfEqICRbeKI/AAAAAAAAG3M/6LqPP3Yt7bw/s640/6_screenshot.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
4 minutes to send the first batch... and there's 10 of them (2000 items for a 20,000 item list!). Screw that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I had also been trying, as a final test to see if REST would be any quicker.&lt;br /&gt;
&lt;br /&gt;
Unforunately REST has a couple of major limitations for large bulk operations. The first is that the "GetItems" equivalent only gets 1000 items at a time. The second is that the BulkUpdate command can only handle 100 items at a time. Not really adequate. If someone has been able to successfully do large operations with the REST API, please let me know how you get on! :)&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Finally...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So, in summary, here's the table of results from these tests. If you have larger batches, Iterating over the ListItemCollections takes longer but the data is written to the server in one go, if you have smaller batches, Iterating over the ListItemCollections is indeed quicker, but there is the delay whilst many batches are written.&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;Method&lt;/td&gt;&lt;td&gt;Time&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SPList.Items&lt;/td&gt;&lt;td&gt;3:13&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Batches of 200 items&lt;/td&gt;&lt;td&gt;4:39&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Batches of 500 items&lt;/td&gt;&lt;td&gt;3:32&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Batches of 50 items&lt;/td&gt;&lt;td&gt;10:53&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Batches of 2000 items&lt;/td&gt;&lt;td&gt;2:51&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Batches of 2000, Iterating over DataTable&lt;/td&gt;&lt;td&gt;&amp;gt; 30 mins&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;div&gt;Be sure to have a look at my other two posts on performance with Item-Level Permissions too (&lt;a href="http://e-junkie-chronicles.blogspot.com/2011/03/sharepoint-2010-performance-with-item.html"&gt;here &lt;/a&gt;and &lt;a href="http://e-junkie-chronicles.blogspot.com/2011/03/sharepoint-2010-performance-with-item_23.html"&gt;here&lt;/a&gt;), if you found this interesting/helpful.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-344512740607708189?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2PaLsfm7xeCI3sM0H8dUZDGvd3c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2PaLsfm7xeCI3sM0H8dUZDGvd3c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2PaLsfm7xeCI3sM0H8dUZDGvd3c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2PaLsfm7xeCI3sM0H8dUZDGvd3c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/Sz5IZl8RzZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/344512740607708189/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=344512740607708189" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/344512740607708189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/344512740607708189?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/Sz5IZl8RzZc/list-item-performance-updating-large.html" title="List Item Performance - Updating Large Lists" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-P4T-n20X9Uk/TfEhmCdJ5VI/AAAAAAAAG24/Ypen3lxffII/s72-c/1_screenshot.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/06/list-item-performance-updating-large.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBQ388eip7ImA9WhZVGUk.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-7670543243876078811</id><published>2011-06-01T16:30:00.004+01:00</published><updated>2011-06-01T16:34:12.172+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-01T16:34:12.172+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>Reordering Content Types Programmatically</title><content type="html">After &lt;a href="http://sharepoint.stackexchange.com/questions/13649/content-type-ordering-or-making-it-default-ct/"&gt;this question&lt;/a&gt; was asked on SharePoint Stack Exchange, I thought I'd share my method of re-ordering content types in a list.&lt;br /&gt;
&lt;br /&gt;
Note: this isn't the only method of doing this, see the thread on SPSE to see more (particularly the UniqueContentTypeOrder property).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;private void ReorderContentTypes(SPWeb web, string listName, string firstContentTypeName)
{
 SPList list = web.Lists[listName];

 SPContentType cType = web.AvailableContentTypes[firstContentTypeName];

 List&amp;lt;SPContentType&amp;gt; oldCTypes = new List&amp;lt;SPContentType&amp;gt;();

 for (int i = list.ContentTypes.Count -1; i &amp;gt;= 0; i--)
 {
  if (!list.ContentTypes[i].Id.IsChildOf(cType.Id))
  {
   oldCTypes.Add(list.ContentTypes[i]);

   list.ContentTypes[i].Delete();
  }
 }

 foreach (SPContentType c in oldCTypes)
 {
  list.ContentTypes.Add(c);
 }

 list.Update();
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-7670543243876078811?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BwUWaG82qPMWdzKO3ADgWl6aLmY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BwUWaG82qPMWdzKO3ADgWl6aLmY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BwUWaG82qPMWdzKO3ADgWl6aLmY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BwUWaG82qPMWdzKO3ADgWl6aLmY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/fc4R3NkXpLo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/7670543243876078811/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=7670543243876078811" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/7670543243876078811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/7670543243876078811?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/fc4R3NkXpLo/reordering-content-types.html" title="Reordering Content Types Programmatically" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/06/reordering-content-types.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcARX07eip7ImA9WhZQEUs.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-5539739543884110143</id><published>2011-04-18T21:57:00.001+01:00</published><updated>2011-04-18T22:44:04.302+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-18T22:44:04.302+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="object model" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>SPList.Items versus the SPQuery</title><content type="html">So you've embarked on writing a bit of code that must enumerate a SharePoint List's Items one by one and do some stuff with them. You've (at some point) came across the Best Practices page on MSDN on &lt;a href="http://msdn.microsoft.com/en-us/library/ee557257.aspx"&gt;Handling Large Folders and Lists&lt;/a&gt;, and seen that using &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.items.aspx"&gt;SPList.Items&lt;/a&gt; is bad. It's bad because you could potentially have a very large (tens of thousands to hundreds of thousands of list items) list which could be queried and loaded into server memory potentially several times per second in a busy environment.&lt;br /&gt;
&lt;br /&gt;
So you decide to use the much-loved (or loathed) &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.aspx"&gt;SPQuery &lt;/a&gt;object to store a CAML query and use &lt;a href="http://msdn.microsoft.com/en-us/library/ms457534.aspx"&gt;SPList.GetItems()&lt;/a&gt;, passing in your SPQuery. But you still want to iterate over all the items and use all the fields in the list, so you basically pass in the SPQuery with empty properties. All good right? Still follows the best practices document outlined above, right?&lt;br /&gt;
&lt;br /&gt;
Wrong.&lt;br /&gt;
&lt;br /&gt;
What Microsoft have slightly glossed over and neglected to highlight in their documentation is the necessity to use filters (the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.query.aspx"&gt;Query&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.rowlimit.aspx"&gt;RowLimit&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.viewfields.aspx"&gt;ViewFields &lt;/a&gt;properties) in your SPQuery object. When you call SPList.Items, the object model creates an empty SPQuery object, populates with minimal properties (it only actually sets the Scope to Recursive, such that it gets all items in all folders) and calls GetItems upon itself. By creating yourself an empty SPQuery object, you're doing the same as SPList.Items.&lt;br /&gt;
&lt;br /&gt;
The documentation only states to apply filers "if appropriate". This sentence should really emphasise the importance of using Filters, because if you don't, you're getting all items.&lt;br /&gt;
&lt;br /&gt;
That page also has some good examples of paginating your results using a combination of RowLimit and ListItemCollectionPosition properties, to ensure you only query to return a small amount of data at a time. This will be particularly important when your web application has Query Throttling enabled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-5539739543884110143?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2c9i8O0s5L0u-9RUmew1kO6wj1Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2c9i8O0s5L0u-9RUmew1kO6wj1Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2c9i8O0s5L0u-9RUmew1kO6wj1Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2c9i8O0s5L0u-9RUmew1kO6wj1Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/HL41a1OHigw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/5539739543884110143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=5539739543884110143" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5539739543884110143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5539739543884110143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/HL41a1OHigw/splistitems-versus-spquery.html" title="SPList.Items versus the SPQuery" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/04/splistitems-versus-spquery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4DSHc9eip7ImA9WhZREUw.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-5353235193695225985</id><published>2011-04-06T19:02:00.000+01:00</published><updated>2011-04-06T19:02:59.962+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-06T19:02:59.962+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="snippet" /><category scheme="http://www.blogger.com/atom/ns#" term="developnent" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="tldr" /><title>Feature Stapling - The TL;DR Version</title><content type="html">In a Site-Scoped Feature, have this line in the Elements.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml" name="code"&gt;&lt;FeatureSiteTemplateAssociation Id="00000000-1111-2222-3333-123456789012" TemplateName="STS#0" /&gt;
&lt;/pre&gt;&lt;br /&gt;
The Id here is the GUID of a Web-Scoped Feature you want to activate every time a Sub-Web of template STS#0 (Team Site) is created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Simples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-5353235193695225985?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vnQkN2lCTOjqcpiFDd6bca3DuWc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vnQkN2lCTOjqcpiFDd6bca3DuWc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vnQkN2lCTOjqcpiFDd6bca3DuWc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vnQkN2lCTOjqcpiFDd6bca3DuWc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/hwR7qgxxrLM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/5353235193695225985/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=5353235193695225985" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5353235193695225985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5353235193695225985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/hwR7qgxxrLM/feature-stapling-tldr-version.html" title="Feature Stapling - The TL;DR Version" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/04/feature-stapling-tldr-version.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANSHg6eCp7ImA9WhZSGUk.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-3849891895661757816</id><published>2011-04-04T19:13:00.000+01:00</published><updated>2011-04-04T19:13:19.610+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-04T19:13:19.610+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>Programmatically Update a Content Type</title><content type="html">Here's a straight forward one. For some reason (don't ask) I had to update a content type in a Feature Receiver (I would have preferred to have created a new content type and inherit) by adding a new field to it.&lt;br /&gt;
&lt;br /&gt;
Here's the code, purely for my personal reference but open in case other people find it helpful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;
SPContentType myCT = web.ContentTypes[new SPContentTypeId("0x010100E271948D51B6564FB8D517B6347459D4")];

SPField myNewField = web.Fields.GetFieldByInternalName("AnotherSiteColumn");

SPFieldLink myNewFieldLink = new SPFieldLink(myNewField);

myCT.FieldLinks.Add(myNewFieldLink);

myCT.Update();
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-3849891895661757816?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iR16DrlJlAiR0qTCm_YZL0S-Szg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iR16DrlJlAiR0qTCm_YZL0S-Szg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iR16DrlJlAiR0qTCm_YZL0S-Szg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iR16DrlJlAiR0qTCm_YZL0S-Szg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/Qy_teyDGp40" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/3849891895661757816/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=3849891895661757816" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3849891895661757816?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3849891895661757816?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/Qy_teyDGp40/programmatically-update-content-type.html" title="Programmatically Update a Content Type" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/04/programmatically-update-content-type.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUHRn4-cCp7ImA9WhZUF00.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-3393115526811521439</id><published>2011-04-02T18:21:00.002+01:00</published><updated>2011-06-10T11:03:57.058+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T11:03:57.058+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="solutions" /><category scheme="http://www.blogger.com/atom/ns#" term="wspbuilder" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2007" /><title>SharePoint 2010: Migrating solutions from SharePoint 2007 - A Caveat</title><content type="html">We're working on a large(ish) project right now in SharePoint 2007 that will quite soon be migrating to SharePoint 2010, so I decided to take the WSPs we've had so far (that work fine in 2007) and see how well they'd work in 2010, either as Farm solutions or User (Sandbox) solutions.&lt;br /&gt;
&lt;br /&gt;
I came across an interesting play in behaviour.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The project in particular isn't uncontrollably big, but it's growing in size and there are 4 of us developers working on it. It turns out that there is a Field element (a site column) being declared twice in an Elements Manifest (elements.xml) file. Why hadn't we spotted this? Because it deploys fine, without error in SharePoint 2007.&lt;br /&gt;
&lt;br /&gt;
Here's where the interesting bit comes in...&lt;br /&gt;
&lt;br /&gt;
I decided to create a new project in Visual Studio 2008 destined for SharePoint 2010 consisting of a dead simple feature that deploys one site column - but declares it twice. Here's the solution's structure in Visual Studio, ready for packaging with WSPbuilder:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TFPAaqv23Kg/TZdXfr_eRFI/AAAAAAAAG2A/mqY27nC-PK4/s1600/SolutionStructure.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-TFPAaqv23Kg/TZdXfr_eRFI/AAAAAAAAG2A/mqY27nC-PK4/s1600/SolutionStructure.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;And here's the Feature and Elements.xml contents (excuse the loss of Case, think my syntax highlighter messes up formatting a bit too much):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml" name="code"&gt;&lt;feature description="Adds a site column" id="C01670B9-A98B-4fbd-9AFD-AC6EF8D70C40" scope="Site" title="My Simple Feature" xmlns="http://schemas.microsoft.com/sharepoint/"&gt;

  &lt;elementmanifests&gt;
    &lt;elementmanifest location="Elements.xml"&gt;
  &lt;/elementmanifest&gt;&lt;/elementmanifests&gt;
&lt;/feature&gt;
&lt;/pre&gt;&lt;br /&gt;
And the Elements...&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml" name="code"&gt;&lt;elements xmlns="http://schemas.microsoft.com/sharepoint/"&gt;

  &lt;field displayname="Simple Field" group="Simple Group" id="{3448D8BC-8497-4d67-8523-743E4E79B080}" name="SimpleField" required="FALSE" sealed="FALSE" sourceid="http://schemas.microsoft.com/sharepoint/v3" staticname="SimpleField" type="Text"&gt;

  &lt;field displayname="Simple Field" group="Simple Group" id="{3448D8BC-8497-4d67-8523-743E4E79B080}" name="SimpleField" required="FALSE" sealed="FALSE" sourceid="http://schemas.microsoft.com/sharepoint/v3" staticname="SimpleField" type="Text"&gt;
&lt;/field&gt;&lt;/field&gt;&lt;/elements&gt;
&lt;/pre&gt;&lt;br /&gt;
So what happens?&lt;br /&gt;
&lt;br /&gt;
Well when you deploy this to SharePoint 2007, and activate the Feature at site collection level - it works without fault. Great! &lt;br /&gt;
&lt;br /&gt;
When we take the WSP and upload it to the Solution Gallery of a SharePoint 2010 site, again it works fine (Site collection features from user solutions seem to be activated automatically on my system, not sure if this is normal).&lt;br /&gt;
&lt;br /&gt;
But, add this solution as a Farm solution in Central Administration, deploy then activate from Site Collection Features and you'll get this error...&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Exception type: SPException 
Exception message: The field with Id {3448d8bc-8497-4d67-8523-743e4e79b080} defined in feature {c01670b9-a98b-4fbd-9afd-ac6ef8d70c40} was found in the current site collection or in a subsite. 
&lt;/pre&gt;&lt;br /&gt;
So Beware! If you intend your solutions developed for 2007 to work as Sandboxed solutions, give them a sanity check by testing the deployment on your development system as a Farm solution first - as it appears to have more stringent validation of Feature elements than the User Code environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-3393115526811521439?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/C3vkDKLBKWmbxRHXN6GibCAm2FE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C3vkDKLBKWmbxRHXN6GibCAm2FE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/C3vkDKLBKWmbxRHXN6GibCAm2FE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C3vkDKLBKWmbxRHXN6GibCAm2FE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/fzaXg1Utdvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/3393115526811521439/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=3393115526811521439" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3393115526811521439?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/3393115526811521439?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/fzaXg1Utdvw/sharepoint-2010-migrating-solutions.html" title="SharePoint 2010: Migrating solutions from SharePoint 2007 - A Caveat" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-TFPAaqv23Kg/TZdXfr_eRFI/AAAAAAAAG2A/mqY27nC-PK4/s72-c/SolutionStructure.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/04/sharepoint-2010-migrating-solutions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUERnsyfyp7ImA9WhZUF00.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-2885849252622478341</id><published>2011-03-23T23:02:00.003Z</published><updated>2011-06-10T11:03:27.597+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T11:03:27.597+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="permissions" /><title>SharePoint 2010 Performance with Item Level Permissions Part 2</title><content type="html">&lt;i&gt;So why the hell's it so slow?&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
This post follows on from &lt;a href="http://e-junkie-chronicles.blogspot.com/2011/03/sharepoint-2010-performance-with-item.html"&gt;my last one&lt;/a&gt; when I looked at the developer dashboard to gain insight into where the performance issues came from when you have a large list with lots of item level permissions.&lt;br /&gt;
&lt;br /&gt;
In this post I'll take a deeper look, using the SQL Server Profiler tool to see what data is being passed around, to confirm my assumptions that large lists with lots of unique item permissions slow down at the database level.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To analyse this better, I decided to use the code from my last post to create 2 identical lists. One was a custom list with 20k items in, all inheriting permissions as default. A second list would have every single item have unique permissions, as I did in the previous experiment. Doing this just lets me have both lists there so I can switch between the two to see what's going on.&lt;br /&gt;
&lt;br /&gt;
The thing I noticed last time was a particular query which took an incredibly long time to execute, one that started&amp;nbsp;&lt;span class="Apple-style-span" style="color: #202020; font-family: monospace; font-size: 13px; line-height: 18px; white-space: pre;"&gt;DECLARE @DocParentIdForRF&lt;/span&gt;. The thing with the developer dashboard is that it hides a varbinary parameter which is passed in. This varbinary is used in the generate of a table variable in this query (look at the snippet from the end of my last post to see this).&lt;br /&gt;
&lt;br /&gt;
You notice in the developer dashboard output that when we have item level permissions, a stored procedure is executed that is not when we don't have the item level permissions - one called &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;proc_GetUniqueScopesInList&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
It turns out that the word "scope" is used to describe what is visible from a certain context (well, duh!), and even in SharePoint, a Scope is the visible of an item from a security context!&lt;br /&gt;
&lt;br /&gt;
So, fire up the SQL Server Profiler, start a new trace and filter it out by your application pool identity (this makes reading this A LOT easier).&lt;br /&gt;
&lt;br /&gt;
When I refresh the page with the inherited permissions (NOT the item-level permissions), I notice that the&amp;nbsp;&lt;span class="Apple-style-span" style="color: #202020; font-family: monospace; font-size: 13px; line-height: 18px; white-space: pre;"&gt;DECLARE @DocParentIdForRF&lt;/span&gt;&amp;nbsp;looks like this - with no varbinary parameter... (click for larger image). Stop the trace as soon as the page has loaded, makes the trace easier to read.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-5y8qVGAzmss/TYp1M28gMyI/AAAAAAAAG10/aWZcvpZu3pc/s1600/NoScopesOutput.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh6.googleusercontent.com/-5y8qVGAzmss/TYp1M28gMyI/AAAAAAAAG10/aWZcvpZu3pc/s640/NoScopesOutput.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Let's clear the output, restart the trace and load the list with the item-level permissions, you'll notice the same query looks like this now:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-_80eJ7VAD4c/TYp1lnLWypI/AAAAAAAAG14/8v5jSwC0jbI/s1600/LargeData.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="https://lh3.googleusercontent.com/-_80eJ7VAD4c/TYp1lnLWypI/AAAAAAAAG14/8v5jSwC0jbI/s640/LargeData.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
See that huge black blob at the bottom? That's the varbinary parameter that the developer dashboard hides from you. Where'd the hell that come from? Look up. See the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;proc_GetUniqueScopesInList&lt;/span&gt;&amp;nbsp;procedure? Have a look at the length of time to execute it...&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-QRH8dxJ7LX0/TYp19-AaR_I/AAAAAAAAG18/VxUKDt9mdM4/s1600/GetScopes.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="32" src="https://lh4.googleusercontent.com/-QRH8dxJ7LX0/TYp19-AaR_I/AAAAAAAAG18/VxUKDt9mdM4/s640/GetScopes.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
... Next to nothing! It's a quick, high optimised (select a couple of columns from this table where these 3 columns match these values), using a table-valued function.&lt;br /&gt;
&lt;br /&gt;
Let's go back to that huge black blob in the screenshot from before. If I get the entirety of that data (starting from the "&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;@L10IMG=0x&lt;/span&gt;" somewhere in there, to the end, and dump it into Notepad++ as a quick way of seeing how long it is, it's a rather cumbersome 640084 characters long (or there abouts). As a hunch, divide it by 32 (the length of a GUID) and you'll get 20,002. Not far off the number of items in that list, is it?&lt;br /&gt;
&lt;br /&gt;
An item-level permission in SharePoint is represented in the content database in a table called "Perms", where each item has the ACL stored as a mask.&lt;br /&gt;
&lt;br /&gt;
When you load up a huge list with lots of item level permissions, a single operation gets every single GUID associated with the ACL for that item and passes that back to the data access layer of SharePoint. When the database retrieves the actual list item data, it will pass in all of the ACL Guids back in as one long string, all concatenated together. The query to get the data creates a table variable re-assembles the the item level ACL Guid associated with each item. How the rest of the query deals with this is anyone's guess at the moment - this table variable might just be passed back to the calling COM object (though I thought they couldn't be used this way....) for the COM object to then sort out which item should be visible to which "scope" (or ACL).&lt;br /&gt;
&lt;br /&gt;
So, what can we take away form this? Passing 640k of data about the place, for a SQL Query to do some substring math and converting to Guids will soon bring your database server to its knees. This is one request and it takes 2000ms to work. Imagine if you have 5 requests per second or more hitting this list!&amp;nbsp;If you think you're gonna need them, might be time to re-architect the solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-2885849252622478341?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/06HMKV-ZlrRJrXKcKQnBnUWV-40/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/06HMKV-ZlrRJrXKcKQnBnUWV-40/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/06HMKV-ZlrRJrXKcKQnBnUWV-40/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/06HMKV-ZlrRJrXKcKQnBnUWV-40/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/-DfyUNtguAE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/2885849252622478341/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=2885849252622478341" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2885849252622478341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/2885849252622478341?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/-DfyUNtguAE/sharepoint-2010-performance-with-item_23.html" title="SharePoint 2010 Performance with Item Level Permissions Part 2" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-5y8qVGAzmss/TYp1M28gMyI/AAAAAAAAG10/aWZcvpZu3pc/s72-c/NoScopesOutput.PNG" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/03/sharepoint-2010-performance-with-item_23.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMRXY7fCp7ImA9WhZUF00.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-5107576403176042537</id><published>2011-03-10T22:54:00.004Z</published><updated>2011-06-10T11:04:44.804+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T11:04:44.804+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2010" /><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="permissions" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><category scheme="http://www.blogger.com/atom/ns#" term="research" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="curiosity" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>SharePoint 2010 Performance with Item Level Permissions</title><content type="html">Tonight's little project was inspired by a conversation on Twitter with &lt;a href="http://twitter.com/#!/wonderlaura"&gt;@WonderLaura&lt;/a&gt; and &lt;a href="http://twitter.com/#!/toddklindt"&gt;@Toddklindt&lt;/a&gt;. Laura had asked about the implications of lots of item-level permissions in a big list in SharePoint (&lt;a href="http://twitter.com/#!/WonderLaura/status/45892623059255297"&gt;here&lt;/a&gt;), to which Todd replied with&lt;a href="http://twitter.com/#!/ToddKlindt/status/45892808384577536"&gt; this&lt;/a&gt;, and followed up with &lt;a href="http://twitter.com/#!/ToddKlindt/status/45895608506122240"&gt;this &lt;/a&gt;and &lt;a href="http://twitter.com/#!/ToddKlindt/status/45897921853534208"&gt;this&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So this got me thinking: where is the performance bottleneck when you have item-level permissions in place? Todd's comments leant towards the construction of the view at the Web Part level, but something was making me think that the checking of permissions would be done at the database-query level. Surely an SPRequest wouldn't poll the database for all items in a request if not all of them are viewable by the user starting the request?&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Time, I thought, to do an experiment. I want to use the SharePoint Foundation 2010 Developer Dashboard to monitor the performance of a large (20,000 item) list before and after item-level permissions have been applied - to help us see if we can spot the bottleneck.&lt;br /&gt;
&lt;br /&gt;
Using SharePoint Foundation 2010, I created a custom list and left it with just the one column for this experiment. I used Visual Studio 2010 (with the CKS:Dev pack) to populate the list with 20,000 items using a Console Application. (Sources for this project can be found at the end of this post).&lt;br /&gt;
&lt;br /&gt;
I then fired up the developer dashboard to see what the performance looks like. I created a normal View in the GUI which returned 200 items from the list. Here's the results (click for larger version):&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-F3bIoF-5kVw/TXlC7tBMHUI/AAAAAAAAG1c/TmfdE3Iokmw/s1600/before.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="https://lh4.googleusercontent.com/-F3bIoF-5kVw/TXlC7tBMHUI/AAAAAAAAG1c/TmfdE3Iokmw/s640/before.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The figures I'm interested in looking at are the "&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;DECLARE @DocParentIdForRF&lt;/span&gt;" Database Query and the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PerfTest OnPreRender&lt;/span&gt; numbers. The latter is the time taking to execute the OnPreRender method of the List (which, in ListViewWebPart, prepares the Ribbon for use, and prepares client side ScriptLinks for DataFormWebPart). I have no idea what the first query is all about, it's not a stored procedure nor a function in the content database and it's definitely not constructed by any of the managed code of SharePoint. If anyone does know what this does, please let me know purely to satisfy my curiosity.&lt;br /&gt;
&lt;br /&gt;
Next, I rolled up another console application to randomly apply one of the Role Definitions available in the site to every single item in the list, giving us a kind of "worse-case" scenario to look. Again, source code for this is at the end of this post.&lt;br /&gt;
&lt;br /&gt;
Back to the list view, and here're the results from the Developer Dashboard. Notice huge jump in both the figures - the database query takes around 2 seconds as well as the OnPreRender for the web part! This was after refreshing the page a total of five times once every 10 seconds to let caching, etc. do its thing.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-bNawrpj_GO0/TXlXSSbAksI/AAAAAAAAG1g/jHe9DWMhuZI/s1600/after5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="https://lh3.googleusercontent.com/-bNawrpj_GO0/TXlXSSbAksI/AAAAAAAAG1g/jHe9DWMhuZI/s640/after5.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
So, for some reason OnPreRender takes an absolute age with a massive list, even though the web part is rendering the same 200 items in the first page of the view, except now we have item level permissions for each one of those items. This method, however, doesn't deal with the items! It just registers ScriptLinks used by the DataFormWebPart.&lt;br /&gt;
&lt;br /&gt;
As the database query takes less time in both before and after, this leads me to think that the query is slowing down the OnPreRender for some reason, thus leading me to suspect further that performance loss is indeed down to the querying of the database!&lt;br /&gt;
&lt;br /&gt;
If anyone else has any thoughts on this, they'd be gratefully received.&lt;br /&gt;
&lt;br /&gt;
And now for the source.&lt;br /&gt;
&lt;br /&gt;
This first piece of code will create your 2000 items.&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;

namespace ItemPerfTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Out.Write("Preparing List...");
            using (SPSite site = new SPSite("http://demolab-sps2010"))
            using (SPWeb web = site.OpenWeb())
            {
                SPList list = web.Lists["PerfTest"];
                for (int i = 0; i &amp;lt; 20001; i++)
                {
                    Console.Out.WriteLine(string.Format("Adding item: {0}...", i));
                    SPListItem item = list.Items.Add();
                    item["Title"] = "Item" + i;
                    item.Update();
                }
            }
        }
    }
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
This second piece will assign each one a randomly selected Role Definition, after breaking the items Role Inheritance.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;using System;
using System.Linq;
using Microsoft.SharePoint;
using System.Collections.Generic;

namespace UniquePermissions
{
    class Program
    {
        static void Main(string[] args)
        {
            List&amp;lt;SPRoleDefinition&amp;gt; roles = new List&amp;lt;SPRoleDefinition&amp;gt;();
            Random numbergenerator = new Random();
            using (SPSite site = new SPSite("http://demolab-sps2010"))
            using (SPWeb web = site.OpenWeb())
            {
                Console.Out.WriteLine("Preparing list...");
                SPRoleDefinition contributor = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                SPRoleDefinition guest = web.RoleDefinitions.GetByType(SPRoleType.Guest);
                roles.Add(contributor);
                roles.Add(guest);
       

                SPList list = web.Lists["PerfTest"];

                foreach(SPListItem item in list.Items)
                {
                    item.BreakRoleInheritance(true);
                    SPRoleAssignment randomRole = web.RoleAssignments[numbergenerator.Next(0, web.RoleAssignments.Count)];
                    item.RoleAssignments.Add(randomRole);
                    item.Update();
                    Console.Out.WriteLine("Applying role assment {0} to item {1}....", randomRole.Member.LoginName, item.Title);
                }
               
            }

            Console.WriteLine();
        }
    }
}
&lt;/pre&gt;&lt;pre class="brush:csharp" name="code"&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
PS: Here's the detail on that query as called:&lt;br /&gt;
&lt;pre&gt;SqlCommand: 'DECLARE @DocParentIdForRF uniqueidentifier SELECT TOP 1 @DocParentIdForRF = Docs.Id FROM Docs WHERE Docs.SiteId = @SITEID AND Docs.DirName = @FDN AND Docs.LeafName = @FLN;        SET NOCOUNT ON; DECLARE @_scopeTbl TABLE(_listId uniqueidentifier NOT NULL,_id uniqueidentifier NOT NULL,_level bit NOT NULL,PRIMARY KEY CLUSTERED(_listId,_id,_level)); DECLARE @_count0_0 INT; SET @_count0_0 = 0; WHILE @_count0_0&amp;lt;@I9P BEGIN  INSERT INTO @_scopeTbl VALUES (@L2, CAST(SUBSTRING(@L10IMG,@_count0_0*16 + 1, 16) AS uniqueidentifier),0); SET @_count0_0=@_count0_0 + 1; END;SELECT TOP(@NUMROWS) t1.[TimeCreated] AS c0, UserData.[tp_Modified], t1.[SortBehavior] AS c2, UserData.[tp_ContentTypeId], UserData.[tp_ID], t1.[ScopeId] AS c4, t1.[Type] AS c1, UserData.[tp_ModerationStatus], UserData.[tp_Level], UserData.[nvarchar1], CASE WHEN DATALENGTH(t1.DirName) = 0 THEN t1.LeafName WHEN DATALENGTH(t1.LeafName) = 0 THEN t1.DirName ELSE t1.DirName + N'/' + t1.LeafName END  AS c3, UserData.[tp_HasAttachment], t1.[LeafName] AS c5, UserData.[nvarchar2] FROM AllUserData AS UserData WITH(INDEX=AllUserData_PK) LEFT OUTER LOOP JOIN Docs AS t1 WITH(NOLOCK) ON (UserData.[tp_CalculatedVersion] = 0 ) AND (UserData.[tp_IsCurrentVersion] = CONVERT(bit,1) ) AND (UserData.[tp_DeleteTransactionId] = 0x ) AND (UserData.[tp_RowOrdinal] = 0) AND (t1.SiteId=UserData.tp_SiteId) AND (t1.SiteId = @SITEID) AND (t1.ParentId = UserData.tp_ParentId) AND (t1.Id = UserData.tp_DocId) AND ( (UserData.tp_Level = 1) ) AND (t1.Level = UserData.tp_Level) AND (t1.IsCurrentVersion = 1) AND (t1.Level = 1 OR t1.Level =  2) WHERE ( (UserData.tp_Level = 1) ) AND (UserData.tp_SiteId=@SITEID AND (UserData.tp_ParentId=@DocParentIdForRF)) AND (UserData.tp_RowOrdinal=0) AND (t1.SiteId=@SITEID AND (t1.ParentId=@DocParentIdForRF)) AND (UserData.tp_ListID=@LISTID) AND ( (UserData.tp_Level = 1) ) AND (UserData.tp_SiteId=@SITEID AND (UserData.tp_ParentId=@DocParentIdForRF)) AND (UserData.tp_RowOrdinal=0) AND (t1.SiteId=@SITEID AND (t1.ParentId=@DocParentIdForRF)) ORDER BY UserData.[tp_ID]  ASC  OPTION (FORCE ORDER, MAXDOP 1)'
   CommandType: Text CommandTimeout: 0
   Parameter: '@LFFP' Type: UniqueIdentifier Size: 0 Direction: Input Value: '00000000-0000-0000-0000-000000000000'
   Parameter: '@SITEID' Type: UniqueIdentifier Size: 0 Direction: Input Value: '02ea4e54-c1ae-4b8c-92fc-45f0c91af393'
   Parameter: '@L2' Type: UniqueIdentifier Size: 0 Direction: Input Value: '4047d6c1-d522-4db6-91eb-ab257dabbac5'
   Parameter: '@FDN' Type: NVarChar Size: 4000 Direction: Input Value: 'Lists'
   Parameter: '@FLN' Type: NVarChar Size: 4000 Direction: Input Value: 'PerfTest'
   Parameter: '@RequestGuid' Type: UniqueIdentifier Size: 0 Direction: Input Value: '11bf00f2-9479-4ef7-a8c2-9c3b005f7b8e'
   Parameter: '@L6' Type: UniqueIdentifier Size: 0 Direction: Input Value: '17e4e245-cb54-4b57-bc17-ab4215ac66f2'
   Parameter: '@LISTID' Type: UniqueIdentifier Size: 0 Direction: Input Value: '4047d6c1-d522-4db6-91eb-ab257dabbac5'
   Parameter: '@NUMROWS' Type: BigInt Size: 0 Direction: Input Value: '11'
   Parameter: '@I9P' Type: Int Size: 0 Direction: Input Value: '20002'
   Parameter: '@L10IMG' Type: VarBinary Size: -1 Direction: Input
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-5107576403176042537?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hcUrhOmTcsJ8qSCDYXJzMkpq3-k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hcUrhOmTcsJ8qSCDYXJzMkpq3-k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hcUrhOmTcsJ8qSCDYXJzMkpq3-k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hcUrhOmTcsJ8qSCDYXJzMkpq3-k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/IkPFk4eWzoQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/5107576403176042537/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=5107576403176042537" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5107576403176042537?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5107576403176042537?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/IkPFk4eWzoQ/sharepoint-2010-performance-with-item.html" title="SharePoint 2010 Performance with Item Level Permissions" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-F3bIoF-5kVw/TXlC7tBMHUI/AAAAAAAAG1c/TmfdE3Iokmw/s72-c/before.PNG" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/03/sharepoint-2010-performance-with-item.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANSH48cSp7ImA9Wx9bE0w.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-5834385143297555021</id><published>2011-02-21T18:13:00.006Z</published><updated>2011-02-21T18:26:39.079Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T18:26:39.079Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google news" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="rss" /><category scheme="http://www.blogger.com/atom/ns#" term="xslt" /><title>Text-only Description field in Google News RSS Feeds in XSLT</title><content type="html">&lt;a href="http://2.bp.blogspot.com/-d59hev0j7JE/TWKs7oVOVEI/AAAAAAAAG0w/8EL6PXIW5L8/s1600/Capture.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="278" src="http://2.bp.blogspot.com/-d59hev0j7JE/TWKs7oVOVEI/AAAAAAAAG0w/8EL6PXIW5L8/s320/Capture.PNG" width="320" /&gt;&lt;/a&gt;One annoying thing about Google's awesome RSS feed from its news site is the Description field.&lt;br /&gt;
&lt;br /&gt;
If you look at the XML generated by &lt;a href="http://news.google.com/news?q=sharepoint&amp;amp;output=rss"&gt;http://news.google.com/news?q=sharepoint&amp;amp;output=rss&lt;/a&gt; for example, you'll see the Description field is flooded with lots of crap, un-needed, encoded HTML, instead of the pure description in plain text as you'd expect (and probably what is defined in the schema for RSS).&lt;br /&gt;
&lt;br /&gt;
What if you want to scrap all this crap from the Description field, leaving behind what should be in the text? Simple - take a bog-standard "strip HTML" XSLT template (can be found anywhere online after a quick Google/Bing), and pass it to a trimmed-down version of the description field.&lt;br /&gt;
&lt;br /&gt;
Like this. Here's the "strip-HTML" template:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;&amp;lt;xsl:template name="strip-tags"&amp;gt;
  &amp;lt;xsl:param name="text"/&amp;gt;
  &amp;lt;xsl:choose&amp;gt;
    &amp;lt;xsl:when test="contains($text, '&amp;amp;lt;')"&amp;gt;
      &amp;lt;xsl:value-of select="substring-before($text, '&amp;amp;lt;')" /&amp;gt;
      &amp;lt;xsl:call-template name="strip-tags"&amp;gt;
        &amp;lt;xsl:with-param name="text" select="substring-after($text, '&amp;amp;gt;')"/&amp;gt;
      &amp;lt;/xsl:call-template&amp;gt;
    &amp;lt;/xsl:when&amp;gt;
    &amp;lt;xsl:otherwise&amp;gt;
      &amp;lt;xsl:value-of select="$text" /&amp;gt;
    &amp;lt;/xsl:otherwise&amp;gt;
  &amp;lt;/xsl:choose&amp;gt;
&amp;lt;/xsl:template&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
And this is the normal way to call it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;&amp;lt;xsl:variable name="SafeHtml"&amp;gt;
  &amp;lt;xsl:call-template name="strip-tags"&amp;gt;
    &amp;lt;xsl:with-param name="text" select="description"/&amp;gt;
  &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:variable&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
So what we do is look for tags which are always present around the text we're interest in and strip them out.  It might help if you open the feed in Internet Explorer so it renders the encoded HTML, and then copy &amp;amp; paste the contents of a "description" tag into something that can format &amp;amp; tabulate the text (like Visual Studio). (Here's the link for the RSS feed again: &lt;a href="http://news.google.com/news?q=sharepoint&amp;amp;output=rss"&gt;http://news.google.com/news?q=sharepoint&amp;amp;output=rss&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
We can see that before the "real" description text there are the tags: &lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;and toward the end there is &lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;...&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;&lt;br /&gt;
So we just use a bit of string manipulation in the XSLT to make sure we pass in anything in between these two "tokens", like so:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp" name="code"&gt;&amp;lt;xsl:variable name="SafeHtml"&amp;gt;
  &amp;lt;xsl:call-template name="strip-tags"&amp;gt;
    &amp;lt;xsl:with-param name="text" select="substring-before(substring-after(description, '&amp;amp;lt;/font&amp;amp;gt;&amp;amp;lt;/b&amp;amp;gt;&amp;amp;lt;/font&amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;'), '&amp;amp;lt;b&amp;amp;gt;...&amp;amp;lt;/b&amp;amp;gt;&amp;amp;lt;/font&amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;')"/&amp;gt;
  &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:variable&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-5834385143297555021?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E4OghwFaFFel6Qmcr9GVLeE_Cv8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E4OghwFaFFel6Qmcr9GVLeE_Cv8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E4OghwFaFFel6Qmcr9GVLeE_Cv8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E4OghwFaFFel6Qmcr9GVLeE_Cv8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/iVXbWjrH6ec" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/5834385143297555021/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=5834385143297555021" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5834385143297555021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5834385143297555021?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/iVXbWjrH6ec/text-only-description-field-in-google.html" title="Text-only Description field in Google News RSS Feeds in XSLT" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-d59hev0j7JE/TWKs7oVOVEI/AAAAAAAAG0w/8EL6PXIW5L8/s72-c/Capture.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/02/text-only-description-field-in-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcNRX0zfSp7ImA9Wx9UFE4.&quot;"><id>tag:blogger.com,1999:blog-1588656802322476923.post-5339171875812044582</id><published>2011-02-11T15:10:00.001Z</published><updated>2011-02-11T15:11:34.385Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-11T15:11:34.385Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint" /><category scheme="http://www.blogger.com/atom/ns#" term="development" /><title>No Content Types or Site Columns when creating Site Collection from code</title><content type="html">Had a quick frustration today, that some code I had (bog standard SPWebApplication.Sites.Add) would create a site collection fine but had absolutely no content types or site columns. Both galleries were empty.&lt;br /&gt;
&lt;br /&gt;
Lists and Libraries had content types (such as Pages) fine, but SFA in the gallery.&lt;br /&gt;
&lt;br /&gt;
If you have this, you're probably doing what I'm trying to do: constantly tear down and rebuild stuff in an automated manner for testing.&lt;br /&gt;
&lt;br /&gt;
What you need to do is to do an &lt;pre&gt;iisreset&lt;/pre&gt;in between teardown and rebuild of the site collection.&lt;br /&gt;
&lt;br /&gt;
Not sure why this is, something in the object model cache must be getting stuck, but I didn't see anything in the ULS logs as a clue.&lt;br /&gt;
&lt;br /&gt;
Oh, and also: I'm keeping this blog theme. It's getting good feedback :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588656802322476923-5339171875812044582?l=e-junkie-chronicles.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_sjl5caJWmND1jTmn9mhkWjvBU8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_sjl5caJWmND1jTmn9mhkWjvBU8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_sjl5caJWmND1jTmn9mhkWjvBU8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_sjl5caJWmND1jTmn9mhkWjvBU8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/QkILp/~4/36i-M6aTeCM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://e-junkie-chronicles.blogspot.com/feeds/5339171875812044582/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588656802322476923&amp;postID=5339171875812044582" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5339171875812044582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588656802322476923/posts/default/5339171875812044582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/QkILp/~3/36i-M6aTeCM/no-content-types-or-site-columns-when.html" title="No Content Types or Site Columns when creating Site Collection from code" /><author><name>James Love</name><uri>https://profiles.google.com/108872740181045503854</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-KVm2DUALFjo/AAAAAAAAAAI/AAAAAAAAG7U/7VAHTY0RY6Y/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://e-junkie-chronicles.blogspot.com/2011/02/no-content-types-or-site-columns-when.html</feedburner:origLink></entry></feed>

