How to generate SPMetal for a specific list (OOTB: like tasks or contacts) with custom columns

Posted by KunaalKapoor on Geeks with Blogs See other posts from Geeks with Blogs or by KunaalKapoor
Published on Tue, 12 Jun 2012 01:25:13 GMT Indexed on 2012/06/12 4:41 UTC
Read the original article Hit count: 240

Filed under:

SPMetal is used to make use of LINQ on a list in SharePoint 2010

By default when you generate SPMetal on a site you will get a code generated file for most of the lists and probably more. Here is a MSDN link for some info on SPMetal.

http://msdn.microsoft.com/en-us/library/ee538255(office.14).aspx

But what if you want only to generate the code for one list?

Well it is quite simple once you figure it out. You need to add an xml file to override the default settings of SPMetal and specify it in the /parameters option. I will show you how to do this.

First create a Folder that will contain two files (GenerateSPMetalCode.bat and SPMetal.xml).

Below is the content of the files:

GenerateSPMetalCode.bat

"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\SPMetal" /web:http://YourServer /code:OutPutFileName.cs /language:csharp /parameters:SPMetal.xml
pause

SPMetal.xml

<?xml version="1.0" encoding="utf-8"?>
<Web AccessModifier="Internal" 
     xmlns="http://schemas.microsoft.com/SharePoint/2009/spmetal">
    <List Name="ListName">
      <ContentType Name="ContentTypeName" Class="GeneratedClassName" />
    </List>
  <ExcludeOtherLists></ExcludeOtherLists>
</Web>

You will have to change some of the text in the files so that it will be specific to your SharePoint Server Setup. In the bat file you will have to change http://YourServer to the url of the web where your list is. In the SPMetal.xml file you need to change ListName to the name of your list and the ContentTypeName to the name of the content type you want to extract. The GeneratedClassName can be anything but perhaps you should rename it to something more sensible.

Adding the following line: '<List Name="ListName"><ContentType Name="ContentTypeName" Class="GeneratedClassName" /> </List>'  makes sure that any custom columns added to an OOTB list like contacts or tasks are also generated, which are missed out in a regular generation.

So now when you run it the SPMetal command will read the SPMetal.xml list and override its commands. ExcludeOtherLists element makes it so that only the code for the lists you specify will be generated. For some reason I got an error if I had this element above the List element.

You sould now have a code file called OutPutFileName.cs that has been generated. You can now put this in your SharePoint project for use with your LINQ queries against that list.

I will soon write a LINQ example that uses the generated class.

UPDATE: Add the /namespace parameter to add a namespace to the generated code.

"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN\SPMetal" /web:http://YourServer /namespace:MySPMetalNameSpace /code:OutPutFileName.cs  /language:csharp /parameters:SPMetal.xml

© Geeks with Blogs or respective owner