Today I came across the need to be able to upload documents to a SharePoint list. Not so bad, I have done this before, but this time I also need to populate some custom metadata about the document. After a lot of looking, searching and exceptions I finally found the answer and here it is.
Add References to Microsoft.SharePoint.Client Library
Install-Package Microsoft.SharePoint.Client
Define a form
The important part I always forget is the enctype=”multipart/form-data”.
1: <form id="formUpload" method="POST" enctype="multipart/form-data ">
2: <input type="file" id="fileUpload" name="fileUpload" runat="server"/>
3: <input type="submit" value="upload"
4: OnServerClick="btnUploadTheFile_Click" runat="server"/>
5: </form>
The btnUploadTheFile_Click Handler
1: private void UpLoadToSharePoint()
2: {
3: var fileName = Path.GetFileName(fileUpload.PostedFile.FileName);
4: var fileStream = new FileStream(fileUpload.PostedFile.FileName, FileMode.Open);
5: var byteStream = new byte[fileStream.Length];
6: fileStream.Read(byteStream, 0, byteStream.Length);
7:
8: var serverRelativeUrl = "/MySite/MyDocumentLibrary/" + fileName;
9:
10: var fileCreationInformation = new FileCreationInformation
11: {
12: Content = byteStream,
13: Overwrite = true,
14: Url = serverRelativeUrl
15: };
16:
17: var file = _sharePointList.RootFolder.Files.Add(fileCreationInformation);
18: file.ListItemAllFields["Column 1"] = "Value 1";
19: file.ListItemAllFields["Column 2"] = "Value 2";
20: file.ListItemAllFields.Update();
21:
22: _sharePointContext.ExecuteQuery();
23: }
Summary
This simple example shows how easy it is to upload a file to a SharePoint document list and provide additional column information.
I have run into a problem. LINQ didn’t behave as I had expected when trying to query an object from a list. So I set out to figure out what I didn’t know. Turns out I am not alone in this since I have been asked about it several times. This post will look at what you can expect to happen when you query a list of objects that does not contain the item you are looking for. This can produce three different outcomes depending on the way you approach it. You will either get an exception, a null object or an empty object.
Before we begin we need a class to give us some useful data to query against.
I created a real simple Item object with just an id and name, as well as, a simple class to build up a IQueryable<Item> for us to run some LINQ queries against.
1: public class Item
2: {
3: public int Id { get; set; }
4:
5: public string Name { get; set; }
6: }
7:
8: public class ItemData
9: {
10: public IQueryable<Item> GetItems()
11: {
12: var users = new List<Item>
13: {
14: new Item {Id=1, Name = "Item 1"},
15: new Item {Id=2, Name = "Item 2"},
16: new Item {Id=3, Name = "Item 3"},
17: new Item {Id=4, Name = "Item 4"},
18: new Item {Id=5, Name = "Item 5"},
19: };
20:
21: return users.AsQueryable();
22: }
23: }
Single
var single = items.Single(x => x.Id == 10);
Single returns the single, specific item from a sequence of values that matches your query. Single throws an exception if there is not exactly one element in the sequence. In my testing when looking for an item not in the sequence it threw [System.InvalidOperationException] = {"Sequence contains no matching element"}.
Single with DefaultIfEmpty
var singleDefaultIfEmtpy = items.DefaultIfEmpty(new Item()).Single(x => x.Id == 10);
So what changes of we add the .DefaultIfEmpty(new Item()) to the query? None at all, it still throws [System.InvalidOperationException] = {"Sequence contains no matching element"}.
SingleOrDefault
var singleOrDefault = items.SingleOrDefault(x => x.Id == 10);
This one is a little better, it doesn’t throw an exception it returns null. Why didn’t it return an empty Item object? You’d think that would be the default and that it could figure it out because it knows what type of object we are querying for. Nope, if you don’t specify the default value you get null.
SingleOrDefault with DefaultIfEmpty
Ok, so lets specify a default value with .DefaultIfEmpty.
var singleOrDefaultIfEmpty = items.DefaultIfEmpty(new Item())
.SingleOrDefault(x => x.Id == 10);
I expected to get a new Item object, but guess what I got null. I couldn’t figure out why, the documentation states ‘The SingleOrDefault method does not provide a way to specify a default value. If you want to specify a default value other than default(TSource), use the DefaultIfEmpty(Of TSource)(IEnumerable(Of TSource), TSource) method as described in the Example section.’
I did that yet I still got a null, and not an empty Item object. Hopefully, you guys can tell me why.
First and FirstOrDefault, Last and LastOrDefault
First, FirstOrDefault and Last and LastOrDefault gave the same results as their respective counterparts. It appears that the OrDefault doesn’t mean anything.
Where
Let’s look at using Where(), cause hey let’s be honest this is the way I write most of my queries anyway. Where by itself returns IQueryable<T> which what we expect, but let’s look at what happens when use DefaultIfEmpty by itself and with First and FirstOrDefault.
Where with DefaultIfEmpty
var whereDefaultIfEmpty = items.Where(x => x.Id == 10)
.DefaultIfEmpty(new Item());
Hey, we are finally starting to get some results, this returned a new Item object.
Where with First
Ok, so what if we put First?
var whereFirst = items.Where(x => x.Id == 10).First();
Oh, here is our old friend InvalidOperationException, no joy!
Where with First and DefaultIfEmpty
So, for fun let’s see if adding the DefaultIfEmpty makes a difference.
var whereFirstDefaultIfEmpty = items.Where(x => x.Id == 10)
.DefaultIfEmpty(new Item())
.First();
This return a new Item object. Ok, so now we are starting to see when DefaulIfEmpty helps. Remember just using it with First without Where just threw an exception.
Where with FirstOrDefault
var whereFirstOrDefault = items.Where(x => x.Id == 10).FirstOrDefault();
This behaved no different than just using FirstOrDefaul(x=> x.Id == 10), we got a null.
Where with FirstOrDefault and DefaultIfEmpty
Ok, so DefaultIfEmpty made a difference when using First, let’s hope it does the same for FirstOrDefault.
var whereFirstOrDefaultIfEmpty = items.Where(x => x.Id == 10)
.DefaultIfEmpty(new Item())
.FirstOrDefault();
Eureka! A new Item object.
Summary
From what I was able to figure out reading the online documentation and my own testing it I recommend using DefaultIfEmpty() with Where() alone or with FirstOrDefault. But remember using it with Single, SingleOrDefault, First, FirstOrDefault, Last, or LastOrDeafult will not get you the default object, you will either get an InvalidOperationException or null.
Now that I understand how and when DefaultIfEmpty makes a difference I can create LINQ queries that return the results I expect and I will be able to predict if I will get an Exception, Null or Object.
If you have experienced something different, disagree, or have a better way to approach this please post a reply. The discussion just makes all of us better.

Microsoft once again has chosen to award me with the MVP Award for ASP.NET/IIS. Once again I find myself very honored and humbled to be recognized for my efforts in the community. I have always said that even if I am not an MVP I will continue to go out and foster community wherever I can, and I will, but not just yet.
I want to thank the Northwest Arkansas Technical community, hey they have to put up with me
. They have been a great source of ideas and inspiration and I would go to bat for any of you. Thanks for listening to me rant, and for sometimes telling me to shut up
.
Thanks again to Microsoft for the honor of being an MVP and thanks to the community for helping me get there.
When I first saw that ability in Visual Studio 2010 to transform web.config files for the target platform I was very excited. This was a real deployment issue solved for me. Over were the writing code that was environment aware, an maintaining multiple config files; one for each environment and swapping them out at deploy time.
The main thing that disappointed me was that it only worked on web project. This was a real problem for other project types too.
Today I squealed like a little girl when I read SlowCheetah - Web.config Transformation Syntax now generalized for any XML configuration file on Scott Hanselman’s blog.
SlowCheeta - XML Tranforms is a Visual Studio extension that bring configuration file transformations to any xml file. I have downloaded and installed it and will be following Scott’s excellent post to learn more about it.
The Holy Grail of maintaining your configuration files has been achieved!
Last night I was creating a sample application to demonstrate how to add OData to an ASP.NET MVC application. Every time I went to the URL in Internet Explorer (IE9) it kept showing the xml with the RSS style sheet.
Here is what you see:

This is not what I want to see. I searched for a couple of hours on how to turn that off and nothing. Finally, this morning I just started diving through the Internet Explorer settings and finally found it.
To force Internet Explorer to display the XML instead of the stylized view do the following:
- Open Tools->Internet Options
- Select the Content tab
- Click the “Settings” button in the Feed and Web slices section
- Uncheck Turn on feed reading view
- Click “OK” to save the settings
Here is what you see know:

This makes it much easier to make sure I am getting what I expected in the xml return. I don’t use any browser for reading my RSS feeds and have always found it annoying that it kept trying to show me the xml in a format I didn’t want to see. Know I see the XML, gravy!