<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
    <title>X</title>
    <link rel="self" type="application/xml" href="http://geekswithblogs.net/cskardon/Atom.aspx" />
    <subtitle type="html">Coder, not artist.</subtitle>
    <id>http://geekswithblogs.net/cskardon/Default.aspx</id>
    <author>
        <name>Chris Skardon</name>
        <uri>http://geekswithblogs.net/cskardon/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 0.0.0.0">Subtext</generator>
    <updated>2009-11-20T10:25:44Z</updated>
    <entry>
        <title>Icon Editing</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/08/27/icon-editing.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/08/27/icon-editing.aspx</id>
        <published>2009-08-27T02:09:20-05:00:00</published>
        <updated>2009-08-27T02:10:33Z</updated>
        <content type="html">&lt;p&gt;Finally nearing the release of the app I’ve been working on for a little while now, and we near the final polishing points – Icons etc and a problem with the VS2008 icon editor… The problem being that VS2008 seems to have settings of 4bit icons only…&lt;/p&gt;  &lt;p&gt;To the rescue comes &lt;a href="http://www.getpaint.net/download.html"&gt;Paint.NET&lt;/a&gt; and the &lt;a href="http://www.evanolds.com/pdnicocur.html"&gt;Icon/Cursor Plug-in&lt;/a&gt; (both FREE).. This allows you to edit icon files properly, save in 32bit up to 256x256 (which is probably gonna be big enough :))&lt;/p&gt;  &lt;p&gt;It’s pretty simple to use – to the effect that I managed to create this &lt;em&gt;awesome&lt;/em&gt; mouse pointer in less than 10 seconds (I know – surprising eh? looks like it would’ve taken &lt;em&gt;hours!&lt;/em&gt;) &lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/IconEditing_72F3/pointer_4.png" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="spiffy pointer" border="0" alt="spiffy pointer" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/IconEditing_72F3/pointer_thumb_1.png" width="40" height="34" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/134343.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/134343.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/134343.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/134343.aspx</trackback:ping>
    </entry>
    <entry>
        <title>StringFormat annoyances in VS2008</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/07/22/stringformat-annoyances-in-vs2008.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/07/22/stringformat-annoyances-in-vs2008.aspx</id>
        <published>2009-07-22T09:10:32-05:00:00</published>
        <updated>2009-07-22T09:10:32Z</updated>
        <content type="html">&lt;p&gt;I’ve been using StringFormat in my xaml quite a bit recently, and whilst I’ve liked it, I’ve found that code which &lt;em&gt;is&lt;/em&gt; valid tends to cause VS2008 to no longer be able to represent the designer (which some might say is a good thing)…&lt;/p&gt;  &lt;p&gt;Basically, the following code:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding MyValue, StringFormat=The value is {0}}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;causes VS to basically say ‘no way’ and can no longer render the xaml. Pressing F5 shows the Window just fine… Soo… What can we do about it?&lt;/p&gt;

&lt;p&gt;If we modify the ‘StringFormat’ section to read as such:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding MyValue, StringFormat='The value is {0}'}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;VS can represent it just fine… The difference? The single quote characters around the value of the StringFormat.&lt;/p&gt;

&lt;p&gt;Both versions are &lt;em&gt;valid&lt;/em&gt; xaml, just VS can’t represent the former.&lt;/p&gt;

&lt;p&gt;Ahh well.&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/133645.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/133645.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/133645.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/133645.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Windows 7 - Media Center Video Error</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/05/10/windows-7---media-center-video-error.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/05/10/windows-7---media-center-video-error.aspx</id>
        <published>2009-05-10T18:01:02-05:00:00</published>
        <updated>2009-08-20T02:02:14Z</updated>
        <content type="html">Right,&lt;br /&gt;
&lt;br /&gt;
Just a quicky this one - I didn't see anything online about this when I was searching for the solution but - basically - I fired up Media Center and went to watch Live TV, and I got the following error message:&lt;br /&gt;
&lt;br /&gt;
“&lt;font color="#ff0000"&gt;Video Error: Files needed to display video are not installed or not working correctly. Please restart Media Center and or restart the computer&lt;/font&gt;“&lt;br /&gt;
&lt;br /&gt;
Uh oh..&lt;br /&gt;
This was working last night...&lt;br /&gt;
All I'd done was remove myself from the homegroup on the machine...&lt;br /&gt;
Hmmmm&lt;br /&gt;
&lt;br /&gt;
Reinstalling video codecs - no joy.&lt;br /&gt;
Reinstalling video drivers - no joy.&lt;br /&gt;
&lt;br /&gt;
Bugger.&lt;br /&gt;
Quickly test the TV I wanted to record last night did &lt;span style="font-style: italic;"&gt;infact&lt;/span&gt; record...&lt;br /&gt;
&lt;br /&gt;
"Cannot find file"&lt;br /&gt;
&lt;br /&gt;
eh???&lt;br /&gt;
&lt;br /&gt;
Browse to the files in explorer - there they are.. though I notice I needed to elevate to Administrator to run it...&lt;br /&gt;
&lt;br /&gt;
Hmmm&lt;br /&gt;
&lt;br /&gt;
Close Media Center... restart - but &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;run as administrator&lt;/span&gt;...&lt;br /&gt;
&lt;br /&gt;
Recorded TV - ok&lt;br /&gt;
Live TV??? -- ok...&lt;br /&gt;
&lt;br /&gt;
Weird..&lt;img src="http://geekswithblogs.net/cskardon/aggbug/132001.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/132001.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/132001.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/132001.aspx</trackback:ping>
    </entry>
    <entry>
        <title>WCF and LINQ to SQL (Part 4 &amp;ndash; Updates)</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/04/22/wcf-and-linq-to-sql-part-4-ndash-updates.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/04/22/wcf-and-linq-to-sql-part-4-ndash-updates.aspx</id>
        <published>2009-04-22T17:00:00-05:00:00</published>
        <updated>2009-04-22T17:00:00Z</updated>
        <content type="html">&lt;p&gt;If you’ve read parts &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/03/10/wcf-and-linq-to-sql.aspx"&gt;1&lt;/a&gt;, &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/03/18/wcf-and-linq-to-sql-part-2-creates.aspx"&gt;2&lt;/a&gt; and indeed &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/04/07/wcf-and-linq-to-sql-part-3-deletes.aspx"&gt;3&lt;/a&gt; you’ll know we’ve covered the CRD of CRUD, today we will cover the ‘U’ – updates! Updates are more complex than the other scenario’s we’ve covered so far, but not unmanageable. Also – in fairness this is a very simple update, more complex updates will require more thought (duh!) but this should be a good starting point. Let’s get to it!&lt;/p&gt;  &lt;p&gt;We’ll start on familiar ground – updating the interface, adding an ‘UpdateCar’ method:&lt;/p&gt;  &lt;div class="csharpcode"&gt; &lt;/div&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;[OperationContract]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCar(Car car);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;and then we’ll need to implement this in the service:&lt;/p&gt;

&lt;div class="csharpcode"&gt; &lt;/div&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCar(Car car)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Cars.Attach(car, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Now let’s test it to see how it works (remembering to update our service reference in the client!)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;CarsServiceClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsServiceClient();&lt;/pre&gt;

  &lt;pre&gt;Car car = client.GetCar(5);&lt;/pre&gt;

  &lt;pre class="alt"&gt;car.Make = &lt;span class="str"&gt;"Fiat"&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;client.UpdateCar(car);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Fire up the console… ouch! &lt;a href="http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx"&gt;InvalidOperationException&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart4Updates_AF64/InvalidOp_Update1_2.png" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="InvalidOp_Update1" border="0" alt="InvalidOp_Update1" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart4Updates_AF64/InvalidOp_Update1_thumb.png" width="644" height="108" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Let’s try one of the other overloads of the ‘&lt;a href="http://msdn.microsoft.com/en-us/library/bb548978.aspx"&gt;Attach&lt;/a&gt;’ method…&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCar(Car car)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Cars.Attach(car, GetCar(car.ID));&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Run… fail.. bum. Different exception though, we got a ‘&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.linq.duplicatekeyexception.aspx"&gt;DuplicateKeyException&lt;/a&gt;’:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart4Updates_AF64/DupKey_Update_2.png" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="DupKey_Update" border="0" alt="DupKey_Update" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart4Updates_AF64/DupKey_Update_thumb.png" width="644" height="82" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Gah! It appears we &lt;a href="http://www.west-wind.com/weblog/posts/134095.aspx"&gt;can’t attach&lt;/a&gt; the object back to the DataContext, so… what about attempting to copy the members?&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCar(Car car)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Car original = GetCar(car.ID);&lt;/pre&gt;

  &lt;pre&gt;    original.Make = car.Make;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    original.Model = car.Model;&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Yup, that works, but doesn’t copy the Owner / Previous Owners, to achieve those goals we’d need to do them property by property as well; for example, to do the owner:&lt;/p&gt;

&lt;div class="csharpcode"&gt; &lt;/div&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCar(Car car)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Car original = GetCar(car.ID);&lt;/pre&gt;

  &lt;pre&gt;    original.Make = car.Make;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    original.Model = car.Model;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    original.Owner.Surname = car.Owner.Surname;&lt;/pre&gt;

  &lt;pre&gt;    original.Owner.Title = car.Owner.Title;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Messy. Now, this is due to our disconnected manner of working (which we can’t do anything about whilst using WCF), so it’s a coding hit and a pain, as if we add a new property to the car, we need to update our ‘update’ method to deal with it. I guess you could consider going down a reflection route and copying all the properties across. Though – that would still be a pain – checking for ‘EntitySet’ types etc. But that seems complicated.&lt;/p&gt;

&lt;p&gt;To be honest, this is the most annoying aspect. I can’t see any way to connect an object that has been created on a client. Maybe someone else knows, hmph, well…  That about rounds up the WCF / LINQ CRUD series.. (well, to a point)… &lt;/p&gt;

&lt;p&gt;Cheers&lt;/p&gt;

&lt;p&gt;Me&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/131374.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/131374.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/131374.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/131374.aspx</trackback:ping>
    </entry>
    <entry>
        <title>WCF and LINQ to SQL (Part 3 (Deletes))</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/04/07/wcf-and-linq-to-sql-part-3-deletes.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/04/07/wcf-and-linq-to-sql-part-3-deletes.aspx</id>
        <published>2009-04-07T17:00:00-05:00:00</published>
        <updated>2009-04-07T17:00:00Z</updated>
        <content type="html">&lt;p&gt;If you’ve read parts &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/03/10/wcf-and-linq-to-sql.aspx"&gt;1&lt;/a&gt; and &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/03/18/wcf-and-linq-to-sql-part-2-creates.aspx"&gt;2&lt;/a&gt; you’ll know we’ve covered the CR of CRUD, today we will cover the ‘D’ – deletions. We’ll need to update our interface to actually provide this functionality:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;[ServiceContract]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ICarsService&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Car GetCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car);&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; DeleteCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;I’ve decided to delete the car via the identifier we created initially, though there is nothing to stop us using a ‘Car’ instance.&lt;/p&gt;

&lt;p&gt;Anyhews, so, let’s code this up:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DeleteCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    var car = GetCar(id);&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(car == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"Car unknown!"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Cars.DeleteOnSubmit(car);&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Right, to perform a deletion we need the car instance, so we can just get that from our current library code. So… let’s test this bad boy… Remember to ‘Update’ our service reference…&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart3Deletes_7BA4/UpdateServiceReference_2.png" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="UpdateServiceReference" border="0" alt="UpdateServiceReference" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart3Deletes_7BA4/UpdateServiceReference_thumb.png" width="244" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;So, we’ll use the following code:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;CarsServiceClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsServiceClient();&lt;/pre&gt;

  &lt;pre&gt;var car6 = client.GetCar(6);&lt;/pre&gt;

  &lt;pre class="alt"&gt;client.DeleteCar(car6.ID);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;(of course this &lt;em&gt;does&lt;/em&gt; rely on you having a car with an id of ‘6’ in your db)&lt;/p&gt;

&lt;p&gt;Once you’ve got this working (i.e. you have a valid car id) you’ll hit this problem:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart3Deletes_7BA4/SqlException_FK_2.png" rel="lightbox"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SqlException_FK" border="0" alt="SqlException_FK" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart3Deletes_7BA4/SqlException_FK_thumb.png" width="244" height="53" /&gt;&lt;/a&gt; Foreign key constraints!! How do we get around this?&lt;/p&gt;

&lt;p&gt;Well, we need to delete the owner first (and whilst we’re at it, the ‘PreviousOwners'), so let’s update the code:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DeleteCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    var car = GetCar(id);&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(car == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"Car unknown!"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Owners.DeleteOnSubmit(car.Owner);&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var owner &lt;span class="kwrd"&gt;in&lt;/span&gt; car.PreviousOwners)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        _db.PreviousOwners.DeleteOnSubmit(owner);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Cars.DeleteOnSubmit(car);&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Now when we run the code, we succeed!&lt;/p&gt;

&lt;p&gt;There is another way to do the deletion, and that’s to write a stored proc that does the deletion in the correct order, and then, in the CarsDataContext edit the ‘DeleteCar’ method to call the stored proc instead. But I’ll leave that to you :)&lt;/p&gt;

&lt;p&gt;So… All that’s left is the Update part of CRUD… and hopefully I’ll get that done soon!&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/130794.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/130794.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/130794.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/130794.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Happy Ada Lovelace Day 2009 &amp;ndash; Michele Leroux Bustamante!</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/03/24/happy-ada-lovelace-day-2009-ndash-michelle-leroux-bustamante.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/03/24/happy-ada-lovelace-day-2009-ndash-michelle-leroux-bustamante.aspx</id>
        <published>2009-03-24T01:00:00-05:00:00</published>
        <updated>2009-03-24T16:39:30Z</updated>
        <content type="html">&lt;p&gt;I few months ago I took a &lt;a href="http://www.pledgebank.com/AdaLovelaceDay"&gt;pledge&lt;/a&gt; to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"I will &lt;strong&gt;publish a blog post on Tuesday 24th March about a woman in technology whom I admire&lt;/strong&gt; but only if &lt;strong&gt;1,000&lt;/strong&gt; other people will do the same."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;to celebrate &lt;a href="http://en.wikipedia.org/wiki/Ada_Lovelace"&gt;Ada Lovelace&lt;/a&gt; day.&lt;/p&gt;
&lt;p&gt;That time has come!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dasblonde.net/"&gt;&lt;img width="144" height="124" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/HappyAdaLovelaceDay2009_7749/mlbsepia_eea939ea-e9be-4d50-8f58-918cf1b2cbb5.jpg" alt="mlbsepia" title="mlbsepia" style="border: 0px none ; display: inline;" /&gt; Michele Leroux Bustamante&lt;/a&gt; – author of a book I deem as one of the best books I’ve bought to get me into SOA and &lt;a href="http://oreilly.com/catalog/9780596101626/"&gt;learning WCF&lt;/a&gt;… Without it I wouldn’t have got half as far as I have! Now – aside from the selfish reason of the fact that she has helped me with the book – I admire her because of the clarity of the writing, and the ease with which she can (and does) explain a complicated topic like WCF. &lt;/p&gt;
&lt;p&gt;I know it’s not a streaming blog post essay of epic proportions (mainly because quite frankly, I’m a crap writer!), but it is about a woman in technology that I do admire!&lt;/p&gt;
&lt;p&gt;So – Cheers to you Ada, and to you Michele!&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/130330.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/130330.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/130330.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/130330.aspx</trackback:ping>
    </entry>
    <entry>
        <title>WCF and LINQ to SQL (Part 2 (Creates))</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/03/18/wcf-and-linq-to-sql-part-2-creates.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/03/18/wcf-and-linq-to-sql-part-2-creates.aspx</id>
        <published>2009-03-18T18:00:00-05:00:00</published>
        <updated>2009-03-18T18:00:00Z</updated>
        <content type="html">&lt;p&gt;Right, in my &lt;a href="http://geekswithblogs.net/cskardon/archive/2009/03/10/wcf-and-linq-to-sql.aspx"&gt;last post&lt;/a&gt; I wrote about creating a DBML file and hooking it all up through WCF, however, we only got to ‘retrieving’ from the database via the service. So, let’s presume you want to upload… &lt;/p&gt;  &lt;p&gt;We already had our contract:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;[ServiceContract]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ICarsService&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Car GetCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car);&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Of which we’ve tested the ‘GetCar’ method, let’s get to implementing the ‘SubmitCar’ method.&lt;/p&gt;

&lt;p&gt;We actually did implement some code in our class:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    _db.Cars.InsertOnSubmit(car);&lt;/pre&gt;

  &lt;pre&gt;    _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;But, will this work?

&lt;p&gt;Well, our first problem is actually testing it. The WCF Test Client (which we get from an F5 call) is not particularly easy to use to create more complex calls, such as creating a ‘Car’ instance to upload.&lt;/p&gt;

&lt;p&gt;Soooo…. We’d best create ourselves a client app.&lt;/p&gt;

&lt;p&gt;Let’s go to our Solution Explorer, and add a new console project: ‘Client_Console’. Now, to get a service reference to this bad boy… so… Right click on the ‘references’ folder on the Client_Console project and select… ‘Add Service Reference’ (easy eh?)… Now click on ‘Discover’ and this should get your service from the solution.&lt;/p&gt;

&lt;p&gt;Browse to the actual interface you want (probably only one there in this case :)), and give it a good namespace name – I’ve gone for ‘CarsService’ (imaginative eh?).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/AddServiceReference_2.png" rel="lightbox"&gt;&lt;img title="AddServiceReference" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="197" alt="AddServiceReference" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/AddServiceReference_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have that we can code against it, so opening up the ‘program.cs’ file helpfully created by VS for the ‘Client_Console’ app we can construct a new Car instance.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Car car = &lt;span class="kwrd"&gt;new&lt;/span&gt; Car&lt;/pre&gt;

  &lt;pre&gt;              {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                  ID = 5,&lt;/pre&gt;

  &lt;pre&gt;                  Make = &lt;span class="str"&gt;"Ford"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                  Model = &lt;span class="str"&gt;"Focus"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;                  Owner = &lt;span class="kwrd"&gt;new&lt;/span&gt; Owner&lt;/pre&gt;

  &lt;pre class="alt"&gt;                              {&lt;/pre&gt;

  &lt;pre&gt;                                  Surname = &lt;span class="str"&gt;"Milly"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                                  Title = &lt;span class="str"&gt;"Ms"&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                              },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                  PreviousOwners = &lt;span class="kwrd"&gt;new&lt;/span&gt;[]&lt;/pre&gt;

  &lt;pre&gt;                                       {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                                           &lt;span class="kwrd"&gt;new&lt;/span&gt; PreviousOwner {&lt;/pre&gt;

  &lt;pre&gt;                                               Surname = &lt;span class="str"&gt;"Qwerty"&lt;/span&gt;, Title = &lt;span class="str"&gt;"Miss"&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                               WhenBought = DateTime.Now.AddDays(-50)},&lt;/pre&gt;

  &lt;pre&gt;                                           &lt;span class="kwrd"&gt;new&lt;/span&gt; PreviousOwner {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                                               Surname = &lt;span class="str"&gt;"Vanilly"&lt;/span&gt;, Title = &lt;span class="str"&gt;"Mr"&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;                                               WhenBought = DateTime.Now.AddDays(-100)}&lt;/pre&gt;

  &lt;pre class="alt"&gt;                                       }&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;              };&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Great!&lt;/p&gt;

&lt;p&gt;Let’s Submit!!!&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;CarsServiceClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsServiceClient();&lt;/pre&gt;

  &lt;pre&gt;client.SubmitCar(car);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ahhh! NullReferenceException??? What the hey???&lt;/p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/NullRef_2.png" rel="lightbox"&gt;&lt;img title="NullRef" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="91" alt="NullRef" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/NullRef_thumb.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In fairness it’s true, the ‘PreviousOwners’ property on the '&lt;em&gt;server’&lt;/em&gt; &lt;strong&gt;is&lt;/strong&gt; null… But why? Well, the cars object was created in the client,not the server, as a result the constructor for the server version was never called. If we look at the constructor for the ‘Cars’ class we’ll see the following line:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;._PreviousOwners = &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; EntitySet&amp;lt;PreviousOwner&amp;gt;(&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.attach_PreviousOwners), &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.detach_PreviousOwners)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    );&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;okey dokey, let’s change the declaration of the _PreviousOwners member:&lt;/p&gt;

&lt;div class="csharpcode"&gt; &lt;/div&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; EntitySet&amp;lt;PreviousOwner&amp;gt; _PreviousOwners = &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; EntitySet&amp;lt;PreviousOwner&amp;gt;(&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.attach_PreviousOwners), &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.detach_PreviousOwners)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        );&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Ah. We can’t do that as we’re attempting to use ‘non-static’ methods in a member declaration… hmmm, back to the Property itself perhaps…&lt;/p&gt;

&lt;p&gt;What about adding a check for null into the property itself…&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[DataMember]&lt;/pre&gt;

  &lt;pre&gt;[Association(Name=&lt;span class="str"&gt;"Car_PreviousOwner"&lt;/span&gt;, Storage=&lt;span class="str"&gt;"_PreviousOwners"&lt;/span&gt;, ThisKey=&lt;span class="str"&gt;"ID"&lt;/span&gt;, OtherKey=&lt;span class="str"&gt;"CarId"&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; EntitySet&amp;lt;PreviousOwner&amp;gt; PreviousOwners&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    get&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;._PreviousOwners;&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    set&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;(_PreviousOwners == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;            _PreviousOwners = &lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; EntitySet&amp;lt;PreviousOwner&amp;gt;(&lt;/pre&gt;

  &lt;pre&gt;                    &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.attach_PreviousOwners), &lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;PreviousOwner&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.detach_PreviousOwners)&lt;/pre&gt;

  &lt;pre&gt;                    );&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;._PreviousOwners.Assign(&lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Right, so firing F5 on our client now, and lo-and-behold there we are! It works! IT ACTUALLY WORKS!!!&lt;/p&gt;

&lt;p&gt;If go to our WCF Test Client and ‘GetCar’ for ID 5, we should get back our car we just inserted….&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/TestClient_Car_Get5_2.png" rel="lightbox"&gt;&lt;img title="TestClient_Car_Get5" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="406" alt="TestClient_Car_Get5" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQLPart2_9CA5/TestClient_Car_Get5_thumb.png" width="644" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;Huzzah!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, we have Create and Retrieve working from our CRUD code. Obviously we’ll need to work out Updates and Deletes next, (a new post methinks!). &lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff"&gt;I will leave you with one note, concerning the use of the dbml file.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Obviously, it’s a great time saver, the code is generated for you (for better or worse) and the associations etc are all setup, &lt;strong&gt;&lt;em&gt;but&lt;/em&gt;&lt;/strong&gt; once you’ve added your WCF attributes to the classes you’re only one step away from an accident. A little tweak to the dbml will &lt;strong&gt;&lt;em&gt;regenerate&lt;/em&gt;&lt;/strong&gt; all your code. Yes – that does mean you lose all the WCF goodness you’ve put there.&lt;/p&gt;

&lt;p&gt;So, the solution to this? Split the file, once you’re content with your dbml, basically go through the *.designer.cs file and create a separate file with the contents in, then exclude the dbml file from the project. You should find it will all still work, you just won’t have the design interface.&lt;/p&gt;

&lt;p&gt;Other benefits to this approach are that you can add in methods etc to the classes without fear of losing them.&lt;/p&gt;

&lt;p&gt;Anyways, I will be back with part 3, concerning deletes at some near future point (updates will be part 4).&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/130196.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/130196.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/130196.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/130196.aspx</trackback:ping>
    </entry>
    <entry>
        <title>EntitySet.Contains &amp;ndash; uses Reference comparisons - Addendum</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/03/12/entityset.contains-ndash-uses-reference-comparisons---addendum.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/03/12/entityset.contains-ndash-uses-reference-comparisons---addendum.aspx</id>
        <published>2009-03-12T16:03:10-05:00:00</published>
        <updated>2009-03-12T16:03:10Z</updated>
        <content type="html">&lt;p&gt;I realised whilst reviewing some code that you can also implement the &lt;a href="http://msdn.microsoft.com/en-us/library/ms131187.aspx"&gt;IEquatable&amp;lt;T&amp;gt;&lt;/a&gt; interface as well just overriding the Equals (or indeed, in &lt;em&gt;place&lt;/em&gt; of doing that).&lt;/p&gt;  &lt;p&gt;So, back to our Simple class, we could actually write it as such:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Simple : IEquatable&amp;lt;Simple&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; TheInt { get; set; }&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TheString { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Simple(&lt;span class="kwrd"&gt;int&lt;/span&gt; theInt, &lt;span class="kwrd"&gt;string&lt;/span&gt; theString)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        TheInt = theInt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        TheString = theString;&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(Simple other)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;(other == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; TheInt == other.TheInt &amp;amp;&amp;amp; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Equals(TheString, other.TheString);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="csharpcode"&gt; &lt;/div&gt;

&lt;p&gt;This will work perfectly in a collection situation (though again, &lt;em&gt;not&lt;/em&gt; the &lt;a href="http://msdn.microsoft.com/en-us/library/bb341748.aspx"&gt;EntitySet&lt;/a&gt;), but will &lt;strong&gt;&lt;em&gt;fail&lt;/em&gt;&lt;/strong&gt; with the extension method we wrote last time… How?&lt;/p&gt;

&lt;p&gt;Well, let’s say we perform the same test as in the last post:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    EntitySet&amp;lt;Simple&amp;gt; simpleEs = &lt;span class="kwrd"&gt;new&lt;/span&gt; EntitySet&amp;lt;Simple&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;                             {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(1, &lt;span class="str"&gt;"1"&lt;/span&gt;),&lt;/pre&gt;

  &lt;pre&gt;                                 &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;                             };&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Simple s2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;"Contains ES? "&lt;/span&gt; + simpleEs.Contains(s2));&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;"Contains ES? "&lt;/span&gt; + simpleEs.ContainsUsingEquals(s2));&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;We will get the output:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Contains ES? &lt;span class="kwrd"&gt;false&lt;/span&gt;
Contains ES? false&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which isn’t what we want. Clearly when in our extension method we call:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;e.Equals(t)&lt;/pre&gt;

&lt;p&gt;We are only calling the normal Equals method. We could modify this to read:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;((IEquatable&amp;lt;T&amp;gt;)e).Equals(t)&lt;/pre&gt;

&lt;p&gt;Which would work &lt;em&gt;as long&lt;/em&gt; as it was IEquatable&amp;lt;T&amp;gt; (in which case we’d be better off forcing our extension method to only work on objects implementing that interface:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ContainsUsingEquals(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntitySet&amp;lt;T&amp;gt; es, T t)&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;, IEquatable&amp;lt;T&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;{ &lt;span class="rem"&gt;/**/&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;But that seems a bit limiting, so instead I modified the extension to just cover both scenarios. It will attempt to use the IEquatable&amp;lt;T&amp;gt; implementation first, and it that’s not there, use the original equals:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ContainsUsingEquals&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntitySet&amp;lt;T&amp;gt; es, T t)&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (t &lt;span class="kwrd"&gt;is&lt;/span&gt; IEquatable&amp;lt;T&amp;gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var e &lt;span class="kwrd"&gt;in&lt;/span&gt; es)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (((IEquatable&amp;lt;T&amp;gt;)t).Equals(e))&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var e &lt;span class="kwrd"&gt;in&lt;/span&gt; es)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (t.Equals(e))&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Of course it might be more efficient to do the cast of the ‘t’ to IEquatable&amp;lt;T&amp;gt; earlier and use the casted version rather than casting it each time… &lt;/p&gt;

&lt;p&gt;meh&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/130036.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/130036.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/130036.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/130036.aspx</trackback:ping>
    </entry>
    <entry>
        <title>EntitySet.Contains &amp;ndash; uses Reference comparisons</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/03/10/entityset.contains-ndash-uses-reference-comparisons.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/03/10/entityset.contains-ndash-uses-reference-comparisons.aspx</id>
        <published>2009-03-10T16:03:35-05:00:00</published>
        <updated>2009-03-12T16:02:07Z</updated>
        <content type="html">&lt;p&gt;A gotcha that got me :) &lt;/p&gt;  &lt;p&gt;If you’re used to using &lt;a href="http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx"&gt;List&amp;lt;T&amp;gt;&lt;/a&gt; collections, and in particular the way they compare, then you need to know that an &lt;a href="http://msdn.microsoft.com/en-us/library/bb341748.aspx"&gt;EntitySet&lt;/a&gt; (from LINQ to SQL) does the comparison differently… &lt;/p&gt;  &lt;p&gt;In my experience, if I’ve created a class, for example: &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Simple &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; TheInt { get; set; } &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TheString { get; set; } &lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Simple(&lt;span class="kwrd"&gt;int&lt;/span&gt; theInt, &lt;span class="kwrd"&gt;string&lt;/span&gt; theString) &lt;/pre&gt;

  &lt;pre class="alt"&gt;    { &lt;/pre&gt;

  &lt;pre&gt;        TheInt = theInt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        TheString = theString; &lt;/pre&gt;

  &lt;pre&gt;    } &lt;/pre&gt;

  &lt;pre class="alt"&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;And I then add some instances of this class to a List&amp;lt;Simple&amp;gt;, if I want a ‘Contains’ call on this list to return true I would have to override the ‘Equals’ method. &lt;/p&gt;

&lt;p&gt;For example, doing the following: &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args) &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    List&amp;lt;Simple&amp;gt; simpleList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Simple&amp;gt; &lt;/pre&gt;

  &lt;pre&gt;                                  { &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                      &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(1, &lt;span class="str"&gt;"1"&lt;/span&gt;), &lt;/pre&gt;

  &lt;pre&gt;                                      &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;) &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                  }; &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Simple s2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;"Contains? "&lt;/span&gt; + simpleList.Contains(s2)); &lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;"Fin."&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.ReadLine(); &lt;/pre&gt;

  &lt;pre&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Will write out:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Contains? &lt;span class="kwrd"&gt;false&lt;/span&gt; &lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;If I then modify the Simple class and add the following method to it:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(&lt;span class="kwrd"&gt;object&lt;/span&gt; obj) &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Simple other = obj &lt;span class="kwrd"&gt;as&lt;/span&gt; Simple; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(other == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; TheInt == other.TheInt &amp;amp;&amp;amp; TheString == other.TheString; &lt;/pre&gt;

  &lt;pre&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;and then run the Contains code again, I will get:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Contains? &lt;span class="kwrd"&gt;true&lt;/span&gt; &lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which is what I expect. &lt;/p&gt;

&lt;p&gt;But what if we use an EntitySet?&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args) &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    EntitySet&amp;lt;Simple&amp;gt; simpleEs = &lt;span class="kwrd"&gt;new&lt;/span&gt; EntitySet&amp;lt;Simple&amp;gt; &lt;/pre&gt;

  &lt;pre&gt;                                     { &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                         &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(1, &lt;span class="str"&gt;"1"&lt;/span&gt;), &lt;/pre&gt;

  &lt;pre&gt;                                         &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;) &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                     }; &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    List&amp;lt;Simple&amp;gt; simpleList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Simple&amp;gt; &lt;/pre&gt;

  &lt;pre&gt;                                  { &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                      &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(1, &lt;span class="str"&gt;"1"&lt;/span&gt;), &lt;/pre&gt;

  &lt;pre&gt;                                      &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;) &lt;/pre&gt;

  &lt;pre class="alt"&gt;                                  }; &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Simple s2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; Simple(2, &lt;span class="str"&gt;"2"&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;"Contains? "&lt;/span&gt; + simpleList.Contains(s2)); &lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;"Contains ES? "&lt;/span&gt; + simpleEs.Contains(s2)); &lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;"Fin."&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;    Console.ReadLine(); &lt;/pre&gt;

  &lt;pre class="alt"&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;In this case we get:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Contains? &lt;span class="kwrd"&gt;true&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;Contains ES? &lt;span class="kwrd"&gt;false&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which is not what I expect… So.. I did what any other dev would do and fired up Reflector and opened up the ‘System.Data.Linq.dll’ (c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\), and navigated to the EntitySet, then the Contains, and following that onto ‘IndexOf’ and then into ‘entities.IndexOf’ to discover it’s doing a reference comparison:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; IndexOf(T item) &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.count; i++) &lt;/pre&gt;

  &lt;pre&gt;    { &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.items[i] == item) &lt;/pre&gt;

  &lt;pre&gt;        { &lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; i; &lt;/pre&gt;

  &lt;pre&gt;        } &lt;/pre&gt;

  &lt;pre class="alt"&gt;    } &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; -1; &lt;/pre&gt;

  &lt;pre class="alt"&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;See the ‘this.items[i] == item’ comparison? That bad boy is a reference comparison, in other collections (such as the List&amp;lt;T&amp;gt;) the reference comparison is only used if the item being compared is null. &lt;/p&gt;

&lt;p&gt;Now, in fairness, this makes sense from the perspective of LINQ to SQL, clearly, the reference is the actual one we pulled from the database, and we want it to act that way most of the time. But what if we don’t? &lt;/p&gt;

&lt;p&gt;I’ve chosen the Extension method route: &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EntitySetExtensions &lt;/pre&gt;

  &lt;pre&gt;{ &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ContainsUsingEquals&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; EntitySet&amp;lt;T&amp;gt; es, T t) &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    { &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var e &lt;span class="kwrd"&gt;in&lt;/span&gt; es) &lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Equals(t)) &lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    } &lt;/pre&gt;

  &lt;pre&gt;} &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;This initially seems to maybe be inefficient, but I can see from the reflected code that the implementation of ‘IndexOf’ in the EntitySet itself is doing a for loop, so I’m not too worried. Anyhews, if we go back to our example and change the code so instead of ‘Contains’ it uses ‘ContainsUsingEquals’ instead: &lt;/p&gt;

&lt;pre class="csharpcode"&gt;Console.WriteLine(&lt;span class="str"&gt;"Contains ES? "&lt;/span&gt; + simpleEs.ContainsUsingEquals(s2)); &lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;We get:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Contains ES? &lt;span class="kwrd"&gt;true&lt;/span&gt; &lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Which is what I wanted. Obviously, ‘Contains’ will still return false!&lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/129984.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/129984.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/129984.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/129984.aspx</trackback:ping>
    </entry>
    <entry>
        <title>WCF and LINQ to SQL</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/cskardon/archive/2009/03/10/wcf-and-linq-to-sql.aspx" />
        <id>http://geekswithblogs.net/cskardon/archive/2009/03/10/wcf-and-linq-to-sql.aspx</id>
        <published>2009-03-10T11:03:26-05:00:00</published>
        <updated>2009-03-10T11:03:26Z</updated>
        <content type="html">&lt;p&gt;Now, I may be doing this wrong, but at the moment, it works :)&lt;/p&gt;  &lt;p&gt;I’m writing a service to communicate with a database, and provide a consistent front end for the applications that will be using it.&lt;/p&gt;  &lt;p&gt;In the past that has meant writing tonnes of CRUD (Create Read Update Delete) code, usually via Stored Procs, which are then accessed by a ‘DbAccess’ helper class of some variety. Not to mention the added bonus of writing the classes to store the data as it comes out.&lt;/p&gt;  &lt;p&gt;Fortunately the database I’m accessing is small, and so I though it to be a good candidate for messing around with LINQ to SQL, and right I was too! Onto teh meaty stuff….&lt;/p&gt;  &lt;p&gt;Lets say I have a database with 3 tables:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/3_Car_Tables_2.png" rel="lightbox"&gt;&lt;img title="3_Car_Tables" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="197" alt="3_Car_Tables" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/3_Car_Tables_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div&gt; &lt;/div&gt;  &lt;p&gt;To insert into this via the medium of SQL we’re looking at something like:&lt;/p&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;insert &lt;span style="color: #0000ff"&gt;into&lt;/span&gt; Car (ID, Make, Model) &lt;span style="color: #0000ff"&gt;values&lt;/span&gt; (1, &lt;span style="color: #006080"&gt;'Volvo'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'V40'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;insert &lt;span style="color: #0000ff"&gt;into&lt;/span&gt; Owner (CarId, Title, Surname) (1, &lt;span style="color: #006080"&gt;'Mr'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Skardon'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;insert &lt;span style="color: #0000ff"&gt;into&lt;/span&gt; PreviousOwners(CarId, WhenBought, Title, Surname) &lt;span style="color: #0000ff"&gt;values&lt;/span&gt; (1, &lt;span style="color: #006080"&gt;'2003-02-02'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Ms'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Taylor'&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;insert &lt;span style="color: #0000ff"&gt;into&lt;/span&gt; PreviousOwners(CarId, WhenBought, Title, Surname) &lt;span style="color: #0000ff"&gt;values&lt;/span&gt; (1, &lt;span style="color: #006080"&gt;'2001-02-02'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Miss'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Polton'&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Which inevitably ends up becoming wrapped up in stored procs, probably one to Add the car and owner, and another to add previous owners. Eurgh.&lt;/p&gt;

&lt;p&gt;Anyways, we all know that stuff, how about we LINQ it up…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;LINQ to SQL – Really basic edition&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, we want a new VS2008 window… &lt;/p&gt;

&lt;p&gt;Got it?&lt;/p&gt;

&lt;p&gt;Ace – Let us proceed…. Create a new Console App, I’m calling mine ‘LinqToCar’, but you can call it whatever you like :)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/AddNewItem_2.png" rel="lightbox"&gt;&lt;img title="AddNewItem" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="112" alt="AddNewItem" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/AddNewItem_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Once we have that, we add a new item to the project, and select the ‘LINQ to SQL Classes’ type, naming it (again) as you like.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/AddNewItem2_2.png" rel="lightbox"&gt;&lt;img title="AddNewItem2" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="244" alt="AddNewItem2" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/AddNewItem2_thumb.png" width="216" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our new ‘dbml’ window we have we’ll have an empty tableau, let’s get filling it… Open up the ‘Server Explorer’ window in Visual Studio (CTRL+ALT+S), and add a Data connection to the Car database. Open up the ‘Tables’ folder and select all the tables, dragging them into the Object Relational Designer pane. You should end up with something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/ORD_View_2.png" rel="lightbox"&gt;&lt;img title="ORD_View" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="191" alt="ORD_View" src="http://geekswithblogs.net/images/geekswithblogs_net/cskardon/WindowsLiveWriter/WCFandLINQtoSQL_D96F/ORD_View_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Now we can switch back to our Program.cs file and start querying the database…&lt;/p&gt;

&lt;p&gt;But first! We need a datacontext… Luckily we’ve already got one: ‘CarsDataContext’. So, let’s simply enter the following code:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CarsDataContext db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsDataContext();&lt;/pre&gt;

  &lt;pre&gt;        var allCars = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Cars&lt;/pre&gt;

  &lt;pre class="alt"&gt;                      select c;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        allCars.WriteCars();&lt;/pre&gt;

  &lt;pre&gt;        &lt;/pre&gt;

  &lt;pre class="alt"&gt;        Console.WriteLine(&lt;span class="str"&gt;"Press ENTER to exit."&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;        Console.ReadLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CarsExtensions&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteCars(&lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable&amp;lt;Car&amp;gt; cars)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var car &lt;span class="kwrd"&gt;in&lt;/span&gt; cars)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Console.WriteLine(car.ID + &lt;span class="str"&gt;", "&lt;/span&gt; + car.Make + &lt;span class="str"&gt;", "&lt;/span&gt; + car.Model + &lt;span class="str"&gt;", "&lt;/span&gt; + car.Owner.Surname);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The ‘CarExtensions’ class just adds an Extension method to be able to print the contents of an IEnumerable&amp;lt;Car&amp;gt; collection to the console. The important code is the actual selection, first we create our DataContext:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;CarsDataContext db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsDataContext();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Then we perform the query:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;var allCars = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Cars&lt;/pre&gt;

  &lt;pre&gt;                      select c;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;This (as the cunningly named variable suggests) gets us &lt;em&gt;all&lt;/em&gt; the cars (nb, we could have written this in lambda stylee by doing: &lt;/p&gt;

&lt;pre class="csharpcode"&gt;var allCars = db.Cars.Where(c =&amp;gt; c);&lt;/pre&gt;

&lt;p&gt;Anyhews, this is starting to come across as an introduction to LINQ to SQL – which it’s not meant to be. Needless to say, we can perform pretty much any query we want to on this now, experiment with it!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But where does the WCF stuff come into it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, we have all our classes created by the designer - ‘Car’, ‘Owner’ and ‘PreviousOwner’, what would be great would be if we could have access to these via a service and &lt;em&gt;not &lt;/em&gt;have to create ‘mapping’ classes. &lt;/p&gt;

&lt;p&gt;Soooo… how do we go about doing that?&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;Converting the ConsoleApp to a WCFService&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To be honest, the easiest thing to do here is actually start a new ‘WCF Service Library’ project and add a dbml to it in the same way we did above. So, lets do that. (&lt;strong&gt;&lt;em&gt;&lt;font color="#8000ff"&gt;remember to add the LINQ to SQL file as above!!!&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;Assuming you are now staring at an ‘IService1.cs’ file in your VS window, what we should do is go to the Solution Explorer and rename the ‘IService1.cs’ file to something better - ‘ICarsService’ seems a good start. Once we’ve done that, let’s clear out the ‘CompositeType’ and the methods defined for us in the ICarsService interface. So we should end up with a file with the following contents:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[ServiceContract]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ICarsService&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Let’s add two methods, one to get a car, one to submit a car…&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[ServiceContract]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ICarsService&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Car GetCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    [OperationContract]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car);&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Ok, so now we need to go to the Service1.cs file and rename it to something like ‘CarsService’ and then open it for editing… Same deal as before, delete all teh methods given to us and implement the ones defined in the ICarsService.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CarsService : ICarsService&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Car GetCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; System.NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; System.NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Let’s add some simple LINQ code here…&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CarsService : ICarsService&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; CarsDataContext _db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarsDataContext();&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Car GetCar(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; _db.Cars.Where(c =&amp;gt; c.ID == id).Single();&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitCar(Car car)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        _db.Cars.InsertOnSubmit(car);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        _db.SubmitChanges();&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Cool, so… let’s press F5 and load up the WCF Test Client and invoke that bad boy…&lt;/p&gt;

&lt;p&gt;‘GetCar’ – passing ID 1 (as I know it’s there)…&lt;/p&gt;

&lt;p&gt;Gah! WebException… &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p align="left"&gt;‘An error occurred while receiving the HTTP response to &lt;a href="http://localhost:8731/Design_Time_Addresses/CarsLibrary/Service1/"&gt;http://localhost:8731/Design_Time_Addresses/CarsLibrary/Service1/&lt;/a&gt;. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down).’&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hmmm… Ah, wait a minute… Sure, we’re attempting to pass down a ‘Car’ object, but we’ve not defined it as a DataContract… Let’s get onto that!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;We need to open the Cars.designer.cs file and modify the ‘Car’ class.&lt;/p&gt;

&lt;p&gt;First, we need to add the ‘DataContract’ attribute to the class…&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[DataContract]&lt;/pre&gt;

  &lt;pre&gt;[Table(Name=&lt;span class="str"&gt;"dbo.Car"&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Car : INotifyPropertyChanging, INotifyPropertyChanged {...}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Next, we need to modify the properties, so, let’s find the properties, (in our case ‘ID’, ‘Make’, ‘Model’, ‘PreviousOwners’ and ‘Owner’ and add the ‘DataMember’ attribute to them:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[DataMember]&lt;/pre&gt;

  &lt;pre&gt;[Column(Storage=&lt;span class="str"&gt;"_ID"&lt;/span&gt;, DbType=&lt;span class="str"&gt;"Int NOT NULL"&lt;/span&gt;, IsPrimaryKey=&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ID {...}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Ace, now we’re rocking, let’s try again…&lt;/p&gt;

&lt;p&gt;Gah! No we’re not… same error… oh wait, ahh yes, some of our properties refer to other classes (Owner etc) so we’d best DataContract / DataMember those bad boys as well…&lt;/p&gt;

&lt;p&gt;Oh noes! Still doesn’t work.. Let’s have a look at those classes a bit closer…&lt;/p&gt;

&lt;p&gt;What we’ve blindly done (I admit, I made you do this so please forgive me :)) is add the [DataMember] attribute to &lt;em&gt;all&lt;/em&gt; the properties. Now, for the ‘Car’ class that is fine, &lt;em&gt;desired&lt;/em&gt; in fact.. But what about the other classes? Well, inside those we have properties which are classed as ‘Association’ properties, (look at the attributes). How do these work?&lt;/p&gt;

&lt;p&gt;Well… Lets say we’ve done a query, and have a Car object..&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Car car = _db.Cars.Where(c =&amp;gt; c.ID == 1).Single();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;If we now use intellisense we can start skipping through the class…&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;car.Owner&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Get’s us the Owner of the car.. but wait! There’s more!!&lt;/p&gt;

&lt;pre class="csharpcode"&gt;car.Owner.Car&lt;/pre&gt;

&lt;p&gt;??? Eh? Well, that gets us the owner of the car’s car…. but wait!! There’s even more!!!!&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;car.Owner.Car.Owner.......&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A never ending stream of accessibility…!!! This is great &lt;em&gt;internally&lt;/em&gt; to the service, but causes an infinite loop when trying to send the data down, (which is why you’ll get a ‘timeout’ exception).. The solution? Remove the ‘DataMember’ attributes from the [Association] properties…&lt;/p&gt;

&lt;p&gt;Done?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F5&lt;/strong&gt; and try once more…&lt;/p&gt;

&lt;p&gt;Huzzah!&lt;/p&gt;

&lt;p&gt;We have a winner!!!&lt;/p&gt;

&lt;p&gt;So, we can now &lt;em&gt;&lt;strong&gt;Get&lt;/strong&gt;&lt;/em&gt; a LINQ to SQL object from the service to our client.&lt;/p&gt;

&lt;p&gt;I think that’ll be enough for this post… :) The next post will cover the uploading of data to our service… &lt;/p&gt;&lt;img src="http://geekswithblogs.net/cskardon/aggbug/129976.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/cskardon/comments/129976.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/cskardon/comments/commentRss/129976.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/cskardon/services/trackbacks/129976.aspx</trackback:ping>
    </entry>
</feed>