<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2095667813622285254</atom:id><lastBuildDate>Sat, 12 Oct 2024 22:57:23 +0000</lastBuildDate><category>Linq to SQL</category><title>TARIQ SALAH</title><description>My interests are in:&#xa;                   - Microsoft Visual Studio .Net&#xa;                   - Microsoft SQL Server.&#xa;                   - Delphi.&#xa;                   - ERP.&#xa;                   - DNS, SOA, SAS, ... etc.</description><link>http://tareksalah.blogspot.com/</link><managingEditor>noreply@blogger.com (Tariq Salah)</managingEditor><generator>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-7916520992737429585</guid><pubDate>Wed, 13 Oct 2010 09:10:00 +0000</pubDate><atom:updated>2010-10-13T11:10:06.928+02:00</atom:updated><title>Tanzil : Quran Navigator</title><description>&lt;a href=&quot;http://tanzil.info/&quot;&gt;Tanzil : Quran Navigator&lt;/a&gt;</description><link>http://tareksalah.blogspot.com/2010/10/tanzil-quran-navigator.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-5161002740348533518</guid><pubDate>Wed, 19 Mar 2008 20:51:00 +0000</pubDate><atom:updated>2008-03-19T22:51:15.653+02:00</atom:updated><title>Transparent Windows Forms Controls</title><description>&lt;a href=&quot;http://www.bobpowell.net/transcontrols.htm&quot;&gt;Transparent Windows Forms Controls&lt;/a&gt;: &quot;Creating transparent Windows Forms controls.&lt;br /&gt;  &lt;br /&gt;The transparency feature of the Windows Forms control leaves much to be desired and is a blatant fudge. The control is not really transparent, it just pretends to be by looking at the background of it&#39;s parent control and copying the appropriate portion of the image or background onto it&#39;s own surface during the OnPaintBackground method. &lt;br /&gt;  &lt;br /&gt;This means that a &#39;transparent&#39; control placed on top of another on the same parent will in fact obscure the other child controls. Figure 1 shows this effect in action. &lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;Figure1: A supposedly transparent Panel &lt;br /&gt;  &lt;br /&gt;The panel control to the right of the form obscures the PictureBox control and shows only the background of the parent. &lt;br /&gt;  &lt;br /&gt;In order to make a truly transparent control we need to do a couple of things. Firstly, it&#39;s necessary to change the behaviour of the window by giving it a WS_EX_TRANSPARENT style. This is accomplished by overriding the CreateParams property so that the correct window style is included when the control is instantiated. The listing below shows this property override. &lt;br /&gt;  &lt;br /&gt;protected override CreateParams CreateParams &lt;br /&gt;{ &lt;br /&gt;  get &lt;br /&gt;  { &lt;br /&gt;    CreateParams cp=base.CreateParams; &lt;br /&gt;    cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT &lt;br /&gt;    return cp; &lt;br /&gt;  } &lt;br /&gt;} &lt;br /&gt;  &lt;br /&gt;The second thing we need to do is to invalidate the parent of the control, not the control itself, whenever we need to update the graphics. This ensures that whatever is behind the control gets painted before we need to do our own graphics output. To do this, a routine such as that shown in the following listing is needed. &lt;br /&gt;  &lt;br /&gt;protected void InvalidateEx() &lt;br /&gt;{ &lt;br /&gt;  if(Parent==null) &lt;br /&gt;    return; &lt;br /&gt;  Rectangle rc&quot;</description><link>http://tareksalah.blogspot.com/2008/03/transparent-windows-forms-controls.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-1373111648312598174</guid><pubDate>Wed, 19 Mar 2008 20:44:00 +0000</pubDate><atom:updated>2008-03-19T22:46:05.474+02:00</atom:updated><title>pinvoke.net: WindowsMessages (Enums)</title><description>&lt;a href=&quot;http://pinvoke.net/default.aspx/Enums.WindowsMessages&quot;&gt;pinvoke.net: WindowsMessages (Enums)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;public enum WindowsMessages : uint&lt;br /&gt;{&lt;br /&gt;    WM_ACTIVATE = 0x6,&lt;br /&gt;    WM_ACTIVATEAPP = 0x1C,&lt;br /&gt;    WM_AFXFIRST = 0x360,&lt;br /&gt;    WM_AFXLAST = 0x37F,&lt;br /&gt;    WM_APP = 0x8000,&lt;br /&gt;    WM_ASKCBFORMATNAME = 0x30C,&lt;br /&gt;    WM_CANCELJOURNAL = 0x4B,&lt;br /&gt;    WM_CANCELMODE = 0x1F,&lt;br /&gt;    WM_CAPTURECHANGED = 0x215,&lt;br /&gt;    WM_CHANGECBCHAIN = 0x30D,&lt;br /&gt;    WM_CHAR = 0x102,&lt;br /&gt;    WM_CHARTOITEM = 0x2F,&lt;br /&gt;    WM_CHILDACTIVATE = 0x22,&lt;br /&gt;    WM_CLEAR = 0x303,&lt;br /&gt;    WM_CLOSE = 0x10,&lt;br /&gt;    WM_COMMAND = 0x111,&lt;br /&gt;    WM_COMPACTING = 0x41,&lt;br /&gt;    WM_COMPAREITEM = 0x39,&lt;br /&gt;    WM_CONTEXTMENU = 0x7B,&lt;br /&gt;    WM_COPY = 0x301,&lt;br /&gt;    WM_COPYDATA = 0x4A,&lt;br /&gt;    WM_CREATE = 0x1,&lt;br /&gt;    WM_CTLCOLORBTN = 0x135,&lt;br /&gt;    WM_CTLCOLORDLG = 0x136,&lt;br /&gt;    WM_CTLCOLOREDIT = 0x133,&lt;br /&gt;    WM_CTLCOLORLISTBOX = 0x134,&lt;br /&gt;    WM_CTLCOLORMSGBOX = 0x132,&lt;br /&gt;    WM_CTLCOLORSCROLLBAR = 0x137,&lt;br /&gt;    WM_CTLCOLORSTATIC = 0x138,&lt;br /&gt;    WM_CUT = 0x300,&lt;br /&gt;    WM_DEADCHAR = 0x103,&lt;br /&gt;    WM_DELETEITEM = 0x2D,&lt;br /&gt;    WM_DESTROY = 0x2,&lt;br /&gt;    WM_DESTROYCLIPBOARD = 0x307,&lt;br /&gt;    WM_DEVICECHANGE = 0x219,&lt;br /&gt;    WM_DEVMODECHANGE = 0x1B,&lt;br /&gt;    WM_DISPLAYCHANGE = 0x7E,&lt;br /&gt;    WM_DRAWCLIPBOARD = 0x308,&lt;br /&gt;    WM_DRAWITEM = 0x2B,&lt;br /&gt;    WM_DROPFILES = 0x233,&lt;br /&gt;    WM_ENABLE = 0xA,&lt;br /&gt;    WM_ENDSESSION = 0x16,&lt;br /&gt;    WM_ENTERIDLE = 0x121,&lt;br /&gt;    WM_ENTERMENULOOP = 0x211,&lt;br /&gt;    WM_ENTERSIZEMOVE = 0x231,&lt;br /&gt;    WM_ERASEBKGND = 0x14,&lt;br /&gt;    WM_EXITMENULOOP = 0x212,&lt;br /&gt;    WM_EXITSIZEMOVE = 0x232,&lt;br /&gt;    WM_FONTCHANGE = 0x1D,&lt;br /&gt;    WM_GETDLGCODE = 0x87,&lt;br /&gt;    WM_GETFONT = 0x31,&lt;br /&gt;    WM_GETHOTKEY = 0x33,&lt;br /&gt;    WM_GETICON = 0x7F,&lt;br /&gt;    WM_GETMINMAXINFO = 0x24,&lt;br /&gt;    WM_GETOBJECT = 0x3D,&lt;br /&gt;    WM_GETSYSMENU = 0x313,&lt;br /&gt;    WM_GETTEXT = 0xD,&lt;br /&gt;    WM_GETTEXTLENGTH = 0xE,&lt;br /&gt;    WM_HANDHELDFIRST = 0x358,&lt;br /&gt;    WM_HANDHELDLAST = 0x35F,&lt;br /&gt;    WM_HELP = 0x53,&lt;br /&gt;    WM_HOTKEY = 0x312,&lt;br /&gt;    WM_HSCROLL = 0x114,&lt;br /&gt;    WM_HSCROLLCLIPBOARD = 0x30E,&lt;br /&gt;    WM_ICONERASEBKGND = 0x27,&lt;br /&gt;    WM_IME_CHAR = 0x286,&lt;br /&gt;    WM_IME_COMPOSITION = 0x10F,&lt;br /&gt;    WM_IME_COMPOSITIONFULL = 0x284,&lt;br /&gt;    WM_IME_CONTROL = 0x283,&lt;br /&gt;    WM_IME_ENDCOMPOSITION = 0x10E,&lt;br /&gt;    WM_IME_KEYDOWN = 0x290,&lt;br /&gt;    WM_IME_KEYLAST = 0x10F,&lt;br /&gt;    WM_IME_KEYUP = 0x291,&lt;br /&gt;    WM_IME_NOTIFY = 0x282,&lt;br /&gt;    WM_IME_REQUEST = 0x288,&lt;br /&gt;    WM_IME_SELECT = 0x285,&lt;br /&gt;    WM_IME_SETCONTEXT = 0x281,&lt;br /&gt;    WM_IME_STARTCOMPOSITION = 0x10D,&lt;br /&gt;    WM_INITDIALOG = 0x110,&lt;br /&gt;    WM_INITMENU = 0x116,&lt;br /&gt;    WM_INITMENUPOPUP = 0x117,&lt;br /&gt;    WM_INPUT = 0x00FF,&lt;br /&gt;    WM_INPUTLANGCHANGE = 0x51,&lt;br /&gt;    WM_INPUTLANGCHANGEREQUEST = 0x50,&lt;br /&gt;    WM_KEYDOWN = 0x100,&lt;br /&gt;    WM_KEYFIRST = 0x100,&lt;br /&gt;    WM_KEYLAST = 0x108,&lt;br /&gt;    WM_KEYUP = 0x101,&lt;br /&gt;    WM_KILLFOCUS = 0x8,&lt;br /&gt;    WM_LBUTTONDBLCLK = 0x203,&lt;br /&gt;    WM_LBUTTONDOWN = 0x201,&lt;br /&gt;    WM_LBUTTONUP = 0x202,&lt;br /&gt;    WM_MBUTTONDBLCLK = 0x209,&lt;br /&gt;    WM_MBUTTONDOWN = 0x207,&lt;br /&gt;    WM_MBUTTONUP = 0x208,&lt;br /&gt;    WM_MDIACTIVATE = 0x222,&lt;br /&gt;    WM_MDICASCADE = 0x227,&lt;br /&gt;    WM_MDICREATE = 0x220,&lt;br /&gt;    WM_MDIDESTROY = 0x221,&lt;br /&gt;    WM_MDIGETACTIVE = 0x229,&lt;br /&gt;    WM_MDIICONARRANGE = 0x228,&lt;br /&gt;    WM_MDIMAXIMIZE = 0x225,&lt;br /&gt;    WM_MDINEXT = 0x224,&lt;br /&gt;    WM_MDIREFRESHMENU = 0x234,&lt;br /&gt;    WM_MDIRESTORE = 0x223,&lt;br /&gt;    WM_MDISETMENU = 0x230,&lt;br /&gt;    WM_MDITILE = 0x226,&lt;br /&gt;    WM_MEASUREITEM = 0x2C,&lt;br /&gt;    WM_MENUCHAR = 0x120,&lt;br /&gt;    WM_MENUCOMMAND = 0x126,&lt;br /&gt;    WM_MENUDRAG = 0x123,&lt;br /&gt;    WM_MENUGETOBJECT = 0x124,&lt;br /&gt;    WM_MENURBUTTONUP = 0x122,&lt;br /&gt;    WM_MENUSELECT = 0x11F,&lt;br /&gt;    WM_MOUSEACTIVATE = 0x21,&lt;br /&gt;    WM_MOUSEFIRST = 0x200,&lt;br /&gt;    WM_MOUSEHOVER = 0x2A1,&lt;br /&gt;    WM_MOUSELAST = 0x20A,&lt;br /&gt;    WM_MOUSELEAVE = 0x2A3,&lt;br /&gt;    WM_MOUSEMOVE = 0x200,&lt;br /&gt;    WM_MOUSEWHEEL = 0x20A,&lt;br /&gt;    WM_MOUSEHWHEEL = 0x20E,&lt;br /&gt;    WM_MOVE = 0x3,&lt;br /&gt;    WM_MOVING = 0x216,&lt;br /&gt;    WM_NCACTIVATE = 0x86,&lt;br /&gt;    WM_NCCALCSIZE = 0x83,&lt;br /&gt;    WM_NCCREATE = 0x81,&lt;br /&gt;    WM_NCDESTROY = 0x82,&lt;br /&gt;    WM_NCHITTEST = 0x84,&lt;br /&gt;    WM_NCLBUTTONDBLCLK = 0xA3,&lt;br /&gt;    WM_NCLBUTTONDOWN = 0xA1,&lt;br /&gt;    WM_NCLBUTTONUP = 0xA2,&lt;br /&gt;    WM_NCMBUTTONDBLCLK = 0xA9,&lt;br /&gt;    WM_NCMBUTTONDOWN = 0xA7,&lt;br /&gt;    WM_NCMBUTTONUP = 0xA8,&lt;br /&gt;    WM_NCMOUSEHOVER = 0x2A0,&lt;br /&gt;    WM_NCMOUSELEAVE = 0x2A2,&lt;br /&gt;    WM_NCMOUSEMOVE = 0xA0,&lt;br /&gt;    WM_NCPAINT = 0x85,&lt;br /&gt;    WM_NCRBUTTONDBLCLK = 0xA6,&lt;br /&gt;    WM_NCRBUTTONDOWN = 0xA4,&lt;br /&gt;    WM_NCRBUTTONUP = 0xA5,&lt;br /&gt;    WM_NEXTDLGCTL = 0x28,&lt;br /&gt;    WM_NEXTMENU = 0x213,&lt;br /&gt;    WM_NOTIFY = 0x4E,&lt;br /&gt;    WM_NOTIFYFORMAT = 0x55,&lt;br /&gt;    WM_NULL = 0x0,&lt;br /&gt;    WM_PAINT = 0xF,&lt;br /&gt;    WM_PAINTCLIPBOARD = 0x309,&lt;br /&gt;    WM_PAINTICON = 0x26,&lt;br /&gt;    WM_PALETTECHANGED = 0x311,&lt;br /&gt;    WM_PALETTEISCHANGING = 0x310,&lt;br /&gt;    WM_PARENTNOTIFY = 0x210,&lt;br /&gt;    WM_PASTE = 0x302,&lt;br /&gt;    WM_PENWINFIRST = 0x380,&lt;br /&gt;    WM_PENWINLAST = 0x38F,&lt;br /&gt;    WM_POWER = 0x48,&lt;br /&gt;    WM_PRINT = 0x317,&lt;br /&gt;    WM_PRINTCLIENT = 0x318,&lt;br /&gt;    WM_QUERYDRAGICON = 0x37,&lt;br /&gt;    WM_QUERYENDSESSION = 0x11,&lt;br /&gt;    WM_QUERYNEWPALETTE = 0x30F,&lt;br /&gt;    WM_QUERYOPEN = 0x13,&lt;br /&gt;    WM_QUERYUISTATE = 0x129,&lt;br /&gt;    WM_QUEUESYNC = 0x23,&lt;br /&gt;    WM_QUIT = 0x12,&lt;br /&gt;    WM_RBUTTONDBLCLK = 0x206,&lt;br /&gt;    WM_RBUTTONDOWN = 0x204,&lt;br /&gt;    WM_RBUTTONUP = 0x205,&lt;br /&gt;    WM_RENDERALLFORMATS = 0x306,&lt;br /&gt;    WM_RENDERFORMAT = 0x305,&lt;br /&gt;    WM_SETCURSOR = 0x20,&lt;br /&gt;    WM_SETFOCUS = 0x7,&lt;br /&gt;    WM_SETFONT = 0x30,&lt;br /&gt;    WM_SETHOTKEY = 0x32,&lt;br /&gt;    WM_SETICON = 0x80,&lt;br /&gt;    WM_SETREDRAW = 0xB,&lt;br /&gt;    WM_SETTEXT = 0xC,&lt;br /&gt;    WM_SETTINGCHANGE = 0x1A,&lt;br /&gt;    WM_SHOWWINDOW = 0x18,&lt;br /&gt;    WM_SIZE = 0x5,&lt;br /&gt;    WM_SIZECLIPBOARD = 0x30B,&lt;br /&gt;    WM_SIZING = 0x214,&lt;br /&gt;    WM_SPOOLERSTATUS = 0x2A,&lt;br /&gt;    WM_STYLECHANGED = 0x7D,&lt;br /&gt;    WM_STYLECHANGING = 0x7C,&lt;br /&gt;    WM_SYNCPAINT = 0x88,&lt;br /&gt;    WM_SYSCHAR = 0x106,&lt;br /&gt;    WM_SYSCOLORCHANGE = 0x15,&lt;br /&gt;    WM_SYSCOMMAND = 0x112,&lt;br /&gt;    WM_SYSDEADCHAR = 0x107,&lt;br /&gt;    WM_SYSKEYDOWN = 0x104,&lt;br /&gt;    WM_SYSKEYUP = 0x105,&lt;br /&gt;    WM_SYSTIMER = 0x118,  // undocumented, see http://support.microsoft.com/?id=108938&lt;br /&gt;    WM_TCARD = 0x52,&lt;br /&gt;    WM_TIMECHANGE = 0x1E,&lt;br /&gt;    WM_TIMER = 0x113,&lt;br /&gt;    WM_UNDO = 0x304,&lt;br /&gt;    WM_UNINITMENUPOPUP = 0x125,&lt;br /&gt;    WM_USER = 0x400,&lt;br /&gt;    WM_USERCHANGED = 0x54,&lt;br /&gt;    WM_VKEYTOITEM = 0x2E,&lt;br /&gt;    WM_VSCROLL = 0x115,&lt;br /&gt;    WM_VSCROLLCLIPBOARD = 0x30A,&lt;br /&gt;    WM_WINDOWPOSCHANGED = 0x47,&lt;br /&gt;    WM_WINDOWPOSCHANGING = 0x46,&lt;br /&gt;    WM_WININICHANGE = 0x1A,&lt;br /&gt;    WM_XBUTTONDBLCLK = 0x20D,&lt;br /&gt;    WM_XBUTTONDOWN = 0x20B,&lt;br /&gt;    WM_XBUTTONUP = 0x20C&lt;br /&gt;}</description><link>http://tareksalah.blogspot.com/2008/03/pinvokenet-windowsmessages-enums.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-1424005022419651825</guid><pubDate>Fri, 07 Mar 2008 09:33:00 +0000</pubDate><atom:updated>2008-03-07T11:41:19.096+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><title>West Wind - Mr. Rich Strahl A simple Business Object wrapper for LINQ to SQL</title><description>Since two months, I go here in there in the internet to find a usefull starting for Linq to SQL in n-tier. After every round, I return the the most usefull project I&#39;ve ever seen. The Entity Bags is ofcourse very usefull as well.&lt;br /&gt;&lt;br /&gt;Mr. Rich Strahl has the &lt;a href=&quot;http://www.blogger.com/A%20simple%20Business%20Object%20wrapper%20for%20LINQ%20to%20SQL&quot;&gt;original blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I&amp;#39;ve been talking about how I&amp;#39;m using a small business object wrapper around &lt;br /&gt;LINQ to SQL to provide better abstraction of the LINQ to SQL functionality and I &lt;br /&gt;suppose the time&amp;#39;s come to be bit more specific. This is going to be a long post &lt;br /&gt;with a fair bit of code and a brief discussion of the whys and hows. So I want &lt;br /&gt;to share my ideas of what I&amp;#39;m thinking here and an overview of what I&amp;#39;ve built &lt;br /&gt;so far. It&amp;#39;s not complete, but enough to work with to get a feel for it and I&amp;#39;m &lt;br /&gt;using it successfully with a sample app I&amp;#39;m building for my ASP.NET Connections &lt;br /&gt;session. Granted it&amp;#39;s not a complicated app (a Time Trakker) but I have to admit &lt;br /&gt;- especially given my original misgivings and skepticism towards LINQ to SQL - &lt;br /&gt;it&amp;#39;s working out pretty damn well.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I&amp;#39;m throwing this out now to get some thoughts and feedback and I&amp;#39;ll post my &lt;br /&gt;current code so any so inclined can play around with this, but keep in mind this &lt;br /&gt;is rougher than stuff I usually put out publicly so it may take some twiddling.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So... where to start?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;LINQ to SQL is essentially an OR/M tool that requires modeling your data &lt;br /&gt;model to an object model. But while you are using objects, in essence LINQ to &lt;br /&gt;SQL still is little more than a fancy Data Access Layer. It does not make a &lt;br /&gt;business object layer or middle tier. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;It seems these days the concept of business objects is getting buried &lt;br /&gt;somewhat under the veil of technology. I was reminded of that the other day &lt;br /&gt;while reading a post on Rocky&amp;#39;s blog&lt;br /&gt;&lt;a href=&quot;http://www.lhotka.net/weblog/RebuttingSomeQuestionsAboutCSLANET.aspx&quot;&gt;&lt;br /&gt;regarding CSLA in comparison Enterprise Framework&lt;/a&gt;. We are so absorbed by the &lt;br /&gt;discussion of the technological choices that the business and logistical aspects &lt;br /&gt;and separation of responsibility often just seems to get lost. It&amp;#39;s rare these &lt;br /&gt;days to hear people talking about business objects anymore - the focus is all on &lt;br /&gt;the front end and the data access technology itself which is kinda sad, because &lt;br /&gt;in my mind at least business objects really provide the biggest productivity and &lt;br /&gt;stability boost in app development.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My goal with what I&amp;#39;m building is not to build an end all framework - I&amp;#39;ve &lt;br /&gt;never been a fan of big frameworks, but ever since the dawn of time it seems &lt;br /&gt;I&amp;#39;ve built myself a small set of business object wrappers that facilitate the &lt;br /&gt;process of building data centric applications. And this is just one more &lt;br /&gt;iteration of it. This is nowhere as complete as&lt;br /&gt;&lt;a href=&quot;http://www.lhotka.net/cslanet/&quot;&gt;CSlA&lt;/a&gt; or&lt;br /&gt;&lt;a href=&quot;http://www.oakleafsd.com/&quot;&gt;Mere Mortals&lt;/a&gt; or some other framework &lt;br /&gt;would be but it is also smaller and easier to work with. In time, I&amp;#39;m sure &lt;br /&gt;bigger frameworks will integrate with LINQ to SQL or Entity Framework too, but &lt;br /&gt;right now if you want to use this technology you have to roll your own. Again, &lt;br /&gt;this is my vision for my needs and I&amp;#39;m simply sharing it here - I&amp;#39;m not trying &lt;br /&gt;to get into a holy war on which approach is better &amp;lt;s&amp;gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, Business Objects in my mind serve several main purposes (at a minimum):&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Logical Abstraction&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;They abstract the object model in such a way that all code related to &lt;br /&gt;accessing the object model (in this case LINQ to SQL Entities) as well as any &lt;br /&gt;other incidental data access in one place. While an object model may map &lt;br /&gt;database tables and relationships 1 - 1 , the business layer can combine these &lt;br /&gt;objects in any combination necessary to provide the logical high level &lt;br /&gt;abstraction. The typical example here is an invoice object that controls Invoice &lt;br /&gt;header, line items and customers for example. The invoice knows how to access &lt;br /&gt;all of these components and its the business object that accesses the model not &lt;br /&gt;the front end code. Front end code typically interacts with the business object &lt;br /&gt;and receives result data (queries or data objects) or in the case of CRUD &lt;br /&gt;operations entity objects to work with in the UI.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Code Abstraction&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;Just as important as the logical abstraction is the code abstraction in &lt;br /&gt;that all code related to a business object ends up in one place. This may be a &lt;br /&gt;single class or a set of classes, but there&amp;#39;s a distinct place where are &lt;br /&gt;&amp;#39;business logic&amp;#39; is addressed - always in one place. Never does the front end &lt;br /&gt;code talk to the data directly (although with LINQ there&amp;#39;s some blurring of this &lt;br /&gt;line because it gets a little fuzzy of what &amp;#39;data&amp;#39; means when you&amp;#39;re dealing &lt;br /&gt;with LINQ expressions) it only sees the results which are put together by the &lt;br /&gt;business object. One huge advantage with this scenario is that you can easily &lt;br /&gt;reuse business object code in different applications or even different parts of &lt;br /&gt;your application. So if you build an ASP.NET page that access the business &lt;br /&gt;object, you use the same business object you might use a in a Web Service or &lt;br /&gt;even a Windows Forms application. This sort of code reuse simply cannot happen &lt;br /&gt;if you stick any sort of data access code into the UI using DataSource controls &lt;br /&gt;&amp;lt;g&amp;gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;CommonBusiness Object and Data Functionality&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;LINQ to SQL provides a pretty easy data access model through the LINQ &lt;br /&gt;to SQL entity classes and it&amp;#39;s pretty straight forward. A business layer built &lt;br /&gt;ontop of LINQ to SQL can certainly take advantage of this functionality and &lt;br /&gt;reduce the amount of code that needs to get written to provide the basic DAL &lt;br /&gt;functionality (which in non-OR/M environments must be built separately). With &lt;br /&gt;LINQ to SQL a business layer can leverage that functionality directly and even &lt;br /&gt;provide much additional value for data retrieval operations by&lt;br /&gt;&lt;a href=&quot;http://www.west-wind.com/weblog/posts/159522.aspx&quot;&gt;returning results as &lt;br /&gt;LINQ queries as I mentioned yesterday&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But there are also many things missing that a business layer needs. &lt;br /&gt;Validation for example, is not really something that you can or should handle on &lt;br /&gt;the entity model itself. LINQ to SQL does provide OnValidate methods for each &lt;br /&gt;mapped property it creates, but this sort of mechanism is very difficult to &lt;br /&gt;consolidate in a unified validation strategy. So at minmium there should be a &lt;br /&gt;ValidationErrors facility that can be checked and used to ask a business object &lt;br /&gt;to validation itself with a simple Validate() method perhaps.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Loading and Saving too should be simpler for front end code than what LINQ to &lt;br /&gt;SQL provides. Realistically UI code should have to know very little about the &lt;br /&gt;data it needs to access and certainly for simple tasks like retrieving an entity &lt;br /&gt;instance you should just be able to provide a key or potentially call &lt;br /&gt;specialized bus object methods that return an entity. This translates into &lt;br /&gt;standard Load(pk) and Save() methods that know what to do without any further &lt;br /&gt;setup.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Given that LINQ to SQL has some &amp;#39;issues&amp;#39; with disconnected operation that &lt;br /&gt;model should also be abstracted. In my simple framework I have an option flag on &lt;br /&gt;the business object that allows either connected or disconnected operation. By &lt;br /&gt;default the same connected mode that LINQ to SQL uses is used where a &lt;br /&gt;DataContext instance jacked to the business object holds the context&amp;#39;s change &lt;br /&gt;state. Any Save Operation then simply calls submit changes. In disconnected mode &lt;br /&gt;the business object creates a new context for each operation - to feed entities &lt;br /&gt;out and to save them back. The connected mode is more efficient, but if you need &lt;br /&gt;to disconnect it&amp;#39;s easily done or can be overridden for the default behavior &lt;br /&gt;altogether when the object is created.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Finally LINQ to SQL provides essentially DAL functionality - but it doesn&amp;#39;t &lt;br /&gt;provide much in the way of core ADO.NET operations which in some situations &lt;br /&gt;might be handy. There&amp;#39;s no direct support for executing a SQL command and &lt;br /&gt;returning a DataReader or DataTable for example. There&amp;#39;s not a lot of need for &lt;br /&gt;this functionality, but I&amp;#39;ve found that at times it&amp;#39;s damn handy to be able to &lt;br /&gt;return data in otherways. So there&amp;#39;s an extension of the DataContext that &lt;br /&gt;provides the abillity to easily create commands, parameters, and run database &lt;br /&gt;queries and commands more easily.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There&amp;#39;s also a Converter class on the business object that can take a query &lt;br /&gt;(generated through this same business object&amp;#39;s DataContext) and convert it into &lt;br /&gt;a resultset other than an EntityList. This it turns out is pretty important in &lt;br /&gt;that data binding to good old ADO.NET types is much more efficient than binding &lt;br /&gt;to entity lists which require Reflection to bind each data item.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;A simple Business Framework for LINQ to SQL&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;So without much further ado here&amp;#39;s what I&amp;#39;ve built so far. Keep in mind &lt;br /&gt;that this is just a start although I&amp;#39;m finding that what I have so far is quite &lt;br /&gt;adequate to work with.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here&amp;#39;s a a class diagram (with the hacked markup since VS can&amp;#39;t deal with the &lt;br /&gt;generic associations) that shows what the object model looks like:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;http://www.west-wind.com/WebLog/images/200801/WindowsLiveWriter/AsimpleBusinessObjectwrapperforLINQtoSQL_D92A/wwBusinessObject_1.png&quot;&gt;&lt;br /&gt;&lt;img style=&quot;BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px&quot; height=&quot;845&quot; alt=&quot;wwBusinessObject&quot; src=&quot;http://www.west-wind.com/WebLog/images/200801/WindowsLiveWriter/AsimpleBusinessObjectwrapperforLINQtoSQL_D92A/wwBusinessObject_thumb_1.png&quot; width=&quot;923&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;From a usability point of view compared to LINQ to SQL there&amp;#39;s basically just &lt;br /&gt;one extra level of indirection: The business object. So to use this model, you &lt;br /&gt;create a new business object that inherits from wwBusinessObject&amp;lt;TEntity, &lt;br /&gt;TContext&amp;gt; and you provide the generated DataContext and EntityType from your &lt;br /&gt;LINQ to SQL model as generic parameters.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For example:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busEntry&lt;/span&gt; : &lt;span style=&quot;COLOR: #2b91af&quot;&gt;wwBusinessObject&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;, &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeTrakkerContext&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;A&amp;nbsp; DataContext is created for each business object and it manages its &lt;br /&gt;own context. So two business object instances don&amp;#39;t share the same context &lt;br /&gt;state.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The TEntity generic parameter is used for providing a link to the &amp;#39;main&amp;#39; &lt;br /&gt;Entity that is associated with the business object. The business object may deal &lt;br /&gt;with more entities internally but there&amp;#39;s usually going to be a primary entity &lt;br /&gt;that drives the BO. The primary entity is what is updated for the built in CRUD &lt;br /&gt;methods, so when you call Load() you get an instance of the provided entity &lt;br /&gt;type.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Note that the business object also has an internal Entity member which is &lt;br /&gt;loaded by each of the load operations. I&amp;#39;ve always found this very convenient &lt;br /&gt;because it makes it easy to pass around entity data in the context of a page &lt;br /&gt;without having to create separate instances. Load() and NewEntity() will &lt;br /&gt;automatically set the internal entity member, but also return the entity as &lt;br /&gt;return value. The .Entity property is merely a convenience.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For CRUD operations the business object doesn&amp;#39;t require any setup or &lt;br /&gt;configuration code. Simply the above definition is enough to use code like the &lt;br /&gt;following:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry = &lt;span style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busEntry&lt;/span&gt;();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Load(10) == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)  // load by pk&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Entity.Title = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;My Entry&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (!&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Save())&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SetError(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.ErrorMessage);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.NewEntity();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.Title = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;New Entity&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.Save();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: green&quot;&gt;// *** Still pointing at new entity&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Entity.Title = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Something else&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: green&quot;&gt;// *** Delete the entity&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Delete())&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SetError(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Couldn&amp;#39;t delete: &amp;quot;&lt;/span&gt; + &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.ErrorMessage);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;This may not seem like a big improvement over LINQ to SQL, but it&amp;#39;s actually &lt;br /&gt;a lot less code than you&amp;#39;d have to write even with plain LINQ to SQL code and it &lt;br /&gt;handles a fair amount of details behind the scenes such as error handling. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here the client code is not talking directly to the data model to retrieve or &lt;br /&gt;save data - all it does is interact with the entity and then call the business &lt;br /&gt;object &amp;#39;to deal with it&amp;#39;. No LINQ syntax for any of this which is as it should &lt;br /&gt;be IMHO. The UI doesn&amp;#39;t talk to the data or even the model directly, only to the &lt;br /&gt;entities.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Query methods in the business object (such as GetRecentEntries() for example) &lt;br /&gt;generally are implemented as methods that return Query objects. Preferrably &lt;br /&gt;you&amp;#39;d want to return strongly typed entities like this bus object method:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Get open entries for a given user&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;userPk&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; GetOpenEntries(&lt;span style=&quot;COLOR: blue&quot;&gt;int&lt;/span&gt; userPk)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; q = &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;from&lt;/span&gt; e &lt;span style=&quot;COLOR: blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Context.EntryEntities&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;where&lt;/span&gt; !e.PunchedOut&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;orderby&lt;/span&gt; e.TimeIn&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;select&lt;/span&gt; e;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Add filter for User Pk - otherwise all open entries are returned&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (userPk &amp;gt; 0)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        q = q.Where(e =&amp;gt; e.UserPk == userPk);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; q;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;So that the front end code can optionally further filter the query. When a &lt;br /&gt;strongly typed query is returned there are a lot of options to deal with the &lt;br /&gt;data as shown in the following snippet:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; OnInit(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.OnInit(e);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Set up the base query&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; entries = &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.entry.GetOpenEntries(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.TimeTrakkerMaster.UserPk);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;strong&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;int&lt;/span&gt; count = entries.Count();&lt;/strong&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (count == 1)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {                &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;int&lt;/span&gt;? Pk = &lt;strong&gt;entries.Select(en =&amp;gt; en.Pk).FirstOrDefault();&lt;/strong&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (Pk == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            Response.Redirect(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;~/Default.aspx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        Response.Redirect(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;~/punchout.aspx?id=&amp;quot;&lt;/span&gt; + Pk.ToString());&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Assign the data source - note we can filter the data here!&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstEntries.DataSource = &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.entry.Converter.ToDataReader(&lt;br /&gt;                                     &lt;strong&gt;entries.Select(en =&amp;gt; &lt;span style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; { en.Pk, en.Title, en.TimeIn }))&lt;/strong&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstEntries.DataBind();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;All the queries that actually hit the database are shown in bold. Notice that &lt;br /&gt;there are 3 different queries that are run from the original query returned from &lt;br /&gt;the business object, giving the front end code a ton of control of how to &lt;br /&gt;present the data in the UI.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Notice also the entry.Converter.ToDataReader() call for databinding. This &lt;br /&gt;isn&amp;#39;t strictly necessary - you could directly bind the result of the query. &lt;br /&gt;However, databinding to a DataReader() is 3-4 times faster than binding to an &lt;br /&gt;entity list as Entity list binding requires use of Reflection for each data &lt;br /&gt;item. The DataConverter provides an easy way to convert to DataReader, DataTable &lt;br /&gt;(useful for paging, editing and still way faster binding than Entities) and &lt;br /&gt;List. Another advantage of the Converter is that it fires any errors into the &lt;br /&gt;business object so errors can be trapped more effectively.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ok... so the CRUD code above is in connected mode. If you want to run CRUD &lt;br /&gt;operations in disconnected this should work:&lt;/p&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: green&quot;&gt;// *** You can also work on the entities disconnected&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Options.TrackingMode = Westwind.BusinessFramework.&lt;span style=&quot;COLOR: #2b91af&quot;&gt;TrackingModes&lt;/span&gt;.Disconnected;            &lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; entry = &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Load(10);&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;entry.Title = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Updated Title&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry = &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;;   &lt;span style=&quot;COLOR: green&quot;&gt;// kill business object&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: green&quot;&gt;// *** Create a new one&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry = &lt;span style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busEntry&lt;/span&gt;();&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Options.TrackingMode = Westwind.BusinessFramework.&lt;span style=&quot;COLOR: #2b91af&quot;&gt;TrackingModes&lt;/span&gt;.Disconnected;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Save(entry);  &lt;span style=&quot;COLOR: green&quot;&gt;// update disconnected entity&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;To give you an idea of what this looks like in a Web page here&amp;#39;s some code &lt;br /&gt;handles displaying and then saving entity data for a new time entry:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; OnInit(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.OnInit(e);&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Proxy.TargetCallbackType = &lt;span style=&quot;COLOR: blue&quot;&gt;typeof&lt;/span&gt;(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;Callbacks&lt;/span&gt;);  &lt;font color=&quot;#008000&quot;&gt;// wwMethodCallback Ajax Callbacks handler&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Proxy.IsCallback)&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;object&lt;/span&gt; projectQuery = Project.GetOpenProjects();&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstProjects.DataSource = &lt;strong&gt;Project.Converter.ToDataReader&lt;/strong&gt;(projectQuery);&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstProjects.DataValueField = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Pk&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstProjects.DataTextField = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;ProjectName&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstProjects.DataBind();&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;object&lt;/span&gt; customerQuery = Customer.GetCustomerList();&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstCustomers.DataSource = Customer.Converter.ToDataReader(customerQuery); &lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstCustomers.DataTextField = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Company&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstCustomers.DataValueField = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Pk&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.lstCustomers.DataBind();&lt;/pre&gt;&lt;br /&gt;  &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt; &lt;/div&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;&lt;br /&gt;protected&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; OnLoad(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.OnLoad(e);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Proxy.IsCallback)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.TimeTrakkerMaster.SubTitle = &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Punch In New Entry&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;strong&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.NewEntity()&lt;/strong&gt; == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ErrorDisplay.ShowError(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Unable to load new Entry:&amp;lt;br/&amp;gt;&amp;quot;&lt;/span&gt; + &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.ErrorMessage);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (!&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.IsPostBack)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: green&quot;&gt;// *** Get the User&amp;#39;s last settings&lt;br /&gt;        //     we need to load user here no association yet&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busUser&lt;/span&gt; user = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeTrakkerFactory&lt;/span&gt;.GetUser();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;strong&gt;user.Load(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.TimeTrakkerMaster.UserPk)&lt;/strong&gt; != &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;       {                    &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; ( user.Entity.LastCustomer &amp;gt; 0 )&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Entity.CustomerPk = user.Entity.LastCustomer;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (user.Entity.LastProject &amp;gt; 0)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.Entity.ProjectPk = user.Entity.LastProject;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: green&quot;&gt;// *** Now bind it&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.DataBind();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; btnPunchIn_Click(&lt;span style=&quot;COLOR: blue&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;COLOR: #2b91af&quot;&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;{&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Start by unbinding the data from controls into Entity&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.Unbind();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Manual fixup for the split date field&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt; PunchinTime = Entry.GetTimeFromStringValues(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.txtDateIn.Text, &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.txtTimeIn.Text);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (PunchinTime &amp;lt;= &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.BindingErrors.Add( &lt;span style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; Westwind.Web.Controls.&lt;span style=&quot;COLOR: #2b91af&quot;&gt;BindingError&lt;/span&gt;(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Invalid date or time value&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.txtDateIn.ClientID));&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        Entry.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Invalid date or time value&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.txtTimeIn.ClientID);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    Entry.Entity.TimeIn = PunchinTime;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Validate for binding errors - and error out if we have any&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.BindingErrors.Count &amp;gt; 0)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ErrorDisplay.ShowError(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.BindingErrors.ToHtml(), &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Please correct the following:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Have to make sure we associate a user with this entry&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    Entry.Entity.UserPk = &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.TimeTrakkerMaster.UserPk;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Validate business rules&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (!&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.&lt;strong&gt;Entry.Validate&lt;/strong&gt;())&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;COLOR: #2b91af&quot;&gt;ValidationError&lt;/span&gt; error &lt;span style=&quot;COLOR: blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.&lt;strong&gt;Entry.ValidationErrors&lt;/strong&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {                    &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.AddBindingError(error.Message,error.ControlID);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ErrorDisplay.ShowError(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.DataBinder.BindingErrors.ToHtml(), &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Please correct the following:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: green&quot;&gt;// *** Finally save the entity&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (!&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.&lt;strong&gt;Entry.Save&lt;/strong&gt;())&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ErrorDisplay.ShowError(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Couldn&amp;#39;t save entry:&amp;lt;br/&amp;gt;&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                                    &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entry.ErrorMessage);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ErrorDisplay.ShowMessage(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Entry saved.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        Response.AppendHeader(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Refresh&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;2;default.aspx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: green&quot;&gt;// *** Remember last settings for Project and Customer for the user&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: green&quot;&gt;// *** NOTE: Entry.Entity.User is not available here because it&amp;#39;s a NEW record&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: green&quot;&gt;//           so we explicitly load and save settings&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busUser&lt;/span&gt; User = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeTrakkerFactory&lt;/span&gt;.GetUser();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        User.SaveUserPreferences(Entry.Entity.UserPk, Entry.Entity.CustomerPk, Entry.Entity.ProjectPk);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;This is one of the simpler examples that deals mostly with a single business &lt;br /&gt;object but it should give you an idea of how things work. I mentioned the query &lt;br /&gt;functionality yesterday.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The business object&amp;#39;s typical implementation will likely provide:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Query Result Methods&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Methods that return data that is used in the front end. These are methods like &lt;br /&gt;GetOpenProjects() or GetCustomerList() that generally take input parameters and &lt;br /&gt;then create Queries that get returned as a result. Remember queries are not &lt;br /&gt;executed until enumerated so effectively no SQL access occurs until databinding &lt;br /&gt;happens.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Overridden CRUD operations&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;This is actually quite common: You&amp;#39;ll want to set default values or &lt;br /&gt;perform other operations on new entities, set default values (say an Updated &lt;br /&gt;column) on or before saving. This can also mean speciaty methods that basically &lt;br /&gt;overload CRUD operations. For example in Time Trakker I have things like PunchIn &lt;br /&gt;and PunchOut that are essentially overloads of the Save() method that assign &lt;br /&gt;specific values first. For my user object I have AuthenticateAndLoad(string &lt;br /&gt;username, string password) which is essentially an overloaded Load() method.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Convenience Methods&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;Often you also have convenience methods that format data a certain way &lt;br /&gt;or perform special taks in batch on the entity object for example. Or you may &lt;br /&gt;have special operations that run updates against the database. Maybe a &lt;br /&gt;&amp;#39;UpdateTimeTotals()&amp;#39; that ensures that all data in the tables are properly &lt;br /&gt;calculated (which incidentally would be a non-LINQ operation using just a &lt;br /&gt;command object).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Again to give you an idea of what this looks like here&amp;#39;s my business object &lt;br /&gt;for the Entry object:&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: courier new&quot;&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Business object related a time entry.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;busEntry&lt;/span&gt; : &lt;span style=&quot;COLOR: #2b91af&quot;&gt;wwBusinessObject&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;, &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeTrakkerContext&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;    {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Get open entries for a given user&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;userPk&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; GetOpenEntries(&lt;span style=&quot;COLOR: blue&quot;&gt;int&lt;/span&gt; userPk)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; q = &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;from&lt;/span&gt; e &lt;span style=&quot;COLOR: blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Context.EntryEntities&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;where&lt;/span&gt; !e.PunchedOut&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;orderby&lt;/span&gt; e.TimeIn&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;select&lt;/span&gt; e;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;// *** Add filter for User Pk - otherwise all open entries are returned&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (userPk &amp;gt; 0)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                q = q.Where(e =&amp;gt; e.UserPk == userPk);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; q;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Get all open entries&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; GetOpenEntries()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.GetOpenEntries(-1);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Gets a list of recent entries &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;userPk&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;Count&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; GetEntries(&lt;span style=&quot;COLOR: blue&quot;&gt;int&lt;/span&gt; userPk)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: #2b91af&quot;&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt;&amp;gt; q =&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;from&lt;/span&gt; e &lt;span style=&quot;COLOR: blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Context.EntryEntities                &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;orderby&lt;/span&gt; e.TimeIn &lt;span style=&quot;COLOR: blue&quot;&gt;descending&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;select&lt;/span&gt; e;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; q;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;#region&lt;/span&gt;   overridden CRUD operation&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Sets default time value&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; NewEntity()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; entry = &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.NewEntity();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (entry == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)            &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            entry.TimeIn = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeUtilities&lt;/span&gt;.RoundDateToMinuteInterval(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt;.Now,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                                                                   &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.Configuration.MinimumMinuteInterval,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                                                                   &lt;span style=&quot;COLOR: #2b91af&quot;&gt;RoundingDirection&lt;/span&gt;.RoundUp);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            entry.TimeOut = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE;            &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; entry;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Fixes up times for Universal Time to the database&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; Save()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//if (this.Entity.TimeIn != null)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//    this.Entity.TimeIn = this.Entity.TimeIn.ToUniversalTime();            &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//if (this.Entity.TimeOut != null)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//    this.Entity.TimeOut = this.Entity.TimeOut.ToUniversalTime();&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.Save();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Fixes up times for local time from the database&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;pk&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; Load(&lt;span style=&quot;COLOR: blue&quot;&gt;object&lt;/span&gt; pk)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.Load(pk) == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//if (this.Entity.TimeIn != null)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//    this.Entity.TimeIn = Entity.TimeIn.Value.ToLocalTime();&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//if (this.Entity.TimeOut != null)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: green&quot;&gt;//    this.Entity.TimeOut = Entity.TimeOut.Value.ToLocalTime();&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Checks for empty title and time in values and associations for user, customer and project&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; Validate()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.Validate();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.Title))&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;The title is required&amp;quot;&lt;/span&gt;,&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;txtTitle&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn &amp;lt;= &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE)            &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;Time and/or date value is invalid&amp;quot;&lt;/span&gt;,&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;txtTimeIn&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.CustomerPk &amp;lt; 1)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;A customer must be associated with this entry&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;txtCustomerpk&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.ProjectPk &amp;lt; 1)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;A project must be associated with this entry&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;txtProjectPk&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.UserPk &amp;lt; 1)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.ValidationErrors.Add(&lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;A user must be associated with this entry&amp;quot;&lt;/span&gt;, &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot;txtUserPk&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (ValidationErrors.Count &amp;gt; 0)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; punches out an individual entry and saves it&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; PunchOut()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.PunchedOut = &lt;span style=&quot;COLOR: blue&quot;&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt; || &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut &amp;lt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt;.Now;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Save();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Punches in a new entry by setting punch in time&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; PunchIn()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.PunchIn(&lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Punches in a new entry by setting punch in time&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; PunchIn(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; entity)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.PunchedOut = &lt;span style=&quot;COLOR: blue&quot;&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; ( &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn &amp;lt;= &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE )&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt;.Now;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (Entity == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Save();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Save(entity);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Punches out an individual entry and saves it&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;entry&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; PunchOut(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; entry)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            entry.PunchedOut = &lt;span style=&quot;COLOR: blue&quot;&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (entry.TimeOut == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt; || entry.TimeOut &amp;lt; entry.TimeIn)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                entry.TimeOut = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt;.Now;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.CalculateItemTotals();&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Save(entry);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Utility function that converts a date time entry value from&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; a date and time string to a DateTime value&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;Date&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;param name=&amp;quot;Time&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt; GetTimeFromStringValues(&lt;span style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; Date, &lt;span style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; Time)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt; val = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: #2b91af&quot;&gt;DateTime&lt;/span&gt;.TryParse(Date + &lt;span style=&quot;COLOR: teal&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt; + Time,&lt;span style=&quot;COLOR: blue&quot;&gt;out&lt;/span&gt; val);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; val;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Calculates Item and Rate totals and sets it on the passed entry object&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; CalculateItemTotals(&lt;span style=&quot;COLOR: #2b91af&quot;&gt;EntryEntity&lt;/span&gt; Entry)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (Entry == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                Entry = &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity;                       &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (Entry.TimeIn == &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt; || &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                Entry.TimeOut== &lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt; || &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                Entry.TimeOut &amp;lt; Entry.TimeIn)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                Entry.TotalHours = 0.00M;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; ( Entry.TimeOut &amp;gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE &amp;amp;&amp;amp; &lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                      Entry.TimeIn &amp;gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                Entry.TotalHours = (&lt;span style=&quot;COLOR: blue&quot;&gt;decimal&lt;/span&gt;)Entry.TimeOut.Subtract(Entry.TimeIn).TotalHours;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            Entry.ItemTotal = Entry.TotalHours * Entry.Rate;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Calculates Item and Rate totals. This version works off the internal Entity object&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; CalculateItemTotals()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.CalculateItemTotals(&lt;span style=&quot;COLOR: blue&quot;&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; Adjusts the time values for rounding conditions&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: gray&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;COLOR: green&quot;&gt; &lt;/span&gt;&lt;span style=&quot;COLOR: gray&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        &lt;span style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; RoundTimeValues()&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn &amp;gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeUtilities&lt;/span&gt;.RoundDateToMinuteInterval(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeIn,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                        &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.Configuration.MinimumMinuteInterval,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                        &lt;span style=&quot;COLOR: #2b91af&quot;&gt;RoundingDirection&lt;/span&gt;.RoundUp);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;            &lt;span style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut &amp;gt; &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.MIN_DATE_VALUE)&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                &lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut = &lt;span style=&quot;COLOR: #2b91af&quot;&gt;TimeUtilities&lt;/span&gt;.RoundDateToMinuteInterval(&lt;span style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.Entity.TimeOut,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                       &lt;span style=&quot;COLOR: #2b91af&quot;&gt;App&lt;/span&gt;.Configuration.MinimumMinuteInterval,&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;                       &lt;span style=&quot;COLOR: #2b91af&quot;&gt;RoundingDirection&lt;/span&gt;.RoundUp);&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&lt;/pre&gt;&lt;br /&gt; &lt;pre style=&quot;MARGIN: 0px&quot;&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Most of the methods are pretty minimalistic - as you would expect in a simple &lt;br /&gt;application like this. But it should give a pretty clear view of what typically &lt;br /&gt;happens in the business object. The code essentially deals with the core data &lt;br /&gt;manipulation, pre and post processing and of course generation of queries. The &lt;br /&gt;code tends to break down into very clearly defined responsibilities that are &lt;br /&gt;easy to test against. Further given the structure of the business object you &lt;br /&gt;have a sort of template that you follow with most business objects. You &lt;br /&gt;implement Validate() and probably one more Load() related methods and possibly &lt;br /&gt;Save() if there&amp;#39;s some special save syntax. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The business object uses LINQ to SQL for data access and passes out either &lt;br /&gt;LINQ queries (IQueryable&amp;lt;T&amp;gt; for &amp;#39;adjustable&amp;#39; results or IQueryable for fixed &lt;br /&gt;non-mutable results) or returns individual entities for the CRUD methods. In &lt;br /&gt;simple applications like the time tracking app I&amp;#39;m building nearly 90% of the &lt;br /&gt;code deals with CRUD and convenience methods and just a few simple queries which &lt;br /&gt;is quite common for transactional applications.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Most operations require relatively little amounts of code because of the high &lt;br /&gt;level of abstraction that LINQ offers. From a pure code usability perspective &lt;br /&gt;LINQ to SQL is making code cleaner and resulting in quite a bit less of it. So &lt;br /&gt;far I haven&amp;#39;t run into any of my own &amp;#39;warning&amp;#39; points - mainly because I haven&amp;#39;t &lt;br /&gt;gotten there yet. I know I will have issues when I get to the Web Service &lt;br /&gt;portion of things and already had to dodge one issue when using AJAX &lt;br /&gt;serialization. But other than that so far so good.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So there you have it &amp;lt;g&amp;gt;. I&amp;#39;d be interested to hear thoughts.&lt;/p&gt;</description><link>http://tareksalah.blogspot.com/2008/03/west-wind-mr-rich-strahl-simple.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-3031913477696576673</guid><pubDate>Fri, 07 Mar 2008 09:20:00 +0000</pubDate><atom:updated>2008-03-07T11:32:29.873+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><title>LINQ to SQL and WCF - Sharing types, subverting the DataContext on the client side</title><description>I&#39;ve found a starting ideas in this very helpfull chainais blog. He wrote about creating a DataContext in the client side with an empty connection string. This DataContext will be used in the first fitch of the data or after savings to keep the original entities. Then, before saves, he will compare the modified entitites witht the original one.&lt;br /&gt;The original post is &lt;a href=&quot;http://www.cnblogs.com/levinknight/archive/2007/10/15/925362.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ok, so this whole post probably falls into the category of &amp;quot;nasty hack&amp;quot; but &lt;br /&gt;it was something that I was playing with so I thought I&amp;#39;d share.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I wrote a little&lt;br /&gt;&lt;a href=&quot;http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/09/14/9811.aspx&quot;&gt;&lt;br /&gt;bit here previously&lt;/a&gt; about working with LINQ to SQL in a disconnected sense &lt;br /&gt;and wrote about how, if you wanted to manage concurrency in a reasonable way, &lt;br /&gt;then you needed to be able to pass back to a middle-tier server the state of any &lt;br /&gt;entities that you were deleting or updating in order that the server could see &lt;br /&gt;which properties you&amp;#39;d actually updated and which (if any) of the set of &lt;br /&gt;properties that are significant for optimistic concurrency might have been &lt;br /&gt;changed by someone else since you took your data from the database.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Now, in transferring data to a client from that &lt;br /&gt;middle-tier server it seems to me that you can either;&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt;Share &lt;strong&gt;&lt;em&gt;contract&lt;/em&gt; &lt;/strong&gt;with the client. This is the &lt;br /&gt; &amp;quot;web services&amp;quot; way and divorces anything that happens on the client from &lt;br /&gt; what happens in the server. It has advantages (e.g. interoperability, &lt;br /&gt; versioning) but it&amp;#39;s also quite hard to do because none of the clever bits &lt;br /&gt; that you have on the server side is available to you on the client side.&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;li&gt;Share &lt;strong&gt;&lt;em&gt;types&lt;/em&gt;&lt;/strong&gt; with the client. This is simpler &lt;br /&gt; to program against but might hurt you from the versioning point of view and &lt;br /&gt; almost certainly doesn&amp;#39;t help you do interop.&lt;br /&gt; &lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Note - the approach of sharing a &lt;strong&gt;DataSet&lt;/strong&gt; between &lt;br /&gt;  the client and the server falls into this category with the difference &lt;br /&gt;  being that (for .NET) you&amp;#39;re only sharing a single data type (i.e.&lt;br /&gt;  &lt;strong&gt;DataSet&lt;/strong&gt;)&lt;strong&gt; &lt;/strong&gt;between the client and the &lt;br /&gt;  server and that type isn&amp;#39;t actually owned by you so maybe it&amp;#39;s not so &lt;br /&gt;  bad. &lt;/li&gt;&lt;br /&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Whichever of these you go for, if you&amp;#39;re returning objects that you get from &lt;br /&gt;LINQ to SQL then you don&amp;#39;t really have the &lt;strong&gt;DataSet&lt;/strong&gt; (and its &lt;br /&gt;ability to track changes) to help you and that means that someone, somewhere &lt;br /&gt;(and a good candidate is the client) has to store &amp;quot;before&amp;quot; and &amp;quot;after&amp;quot; values &lt;br /&gt;for the entities that you&amp;#39;re manipulating on the client.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;From here on in, I&amp;#39;m only talking about the &lt;em&gt;&lt;strong&gt;shared types&lt;/strong&gt; &lt;br /&gt;approach.&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If we were to go with the shared &lt;strong&gt;&lt;em&gt;types&lt;/em&gt;&lt;/strong&gt; approach &lt;br /&gt;then it becomes interesting because (given the right flags) the LINQ to SQL bits &lt;br /&gt;will give you data types (e.g. &lt;strong&gt;Customer, Order&lt;/strong&gt; and so on from a &lt;br /&gt;Northwind DB) that you can serialize straight to a client over WCF with little &lt;br /&gt;effort.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, down on the client side you&amp;#39;ve got a bunch of &lt;strong&gt;Customer&lt;/strong&gt; &lt;br /&gt;instances and these types are quite smart in that they already implement &lt;strong&gt;&lt;br /&gt;INotifyPropertyChang[ing/ed] &lt;/strong&gt;and so can tell an interested party about &lt;br /&gt;changes to themselves and this might well be a useful building block for you to &lt;br /&gt;be able to build something client-side which allows you to relatively easily &lt;br /&gt;determine which objects have been inserted, updated, deleted when it comes time &lt;br /&gt;to submit them back to a middle-tier service.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I started to think about building some class that would sync up to these &lt;br /&gt;property changed notifications for use on the client side and I kept coming back &lt;br /&gt;to thinking &amp;quot;Hang, on - the &lt;strong&gt;DataContext&lt;/strong&gt; can already do all this &lt;br /&gt;stuff&amp;quot;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So...is it possible to make use of the &lt;strong&gt;DataContext&lt;/strong&gt; client &lt;br /&gt;side in order to do this &amp;quot;change notification stuff&amp;quot; ? It appears that it might &lt;br /&gt;well be but this is where it all gets a bit hacky.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here&amp;#39;s where I ended up.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;1) Built a class library project called &lt;strong&gt;DataTypes&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Into this class library project I added the output of running &lt;strong&gt;&lt;br /&gt;sqlmetal.exe /server:. /database:northwind /serialization:Unidirectional &lt;br /&gt;/pluralize /code:northwind.cs&lt;/strong&gt; and that means that I&amp;#39;ve now got one &lt;br /&gt;project with the data types that I need to serialize backwards and forwards to &lt;br /&gt;my service code all contained in one place so that I can reference them from my &lt;br /&gt;client and my service (shared types!).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;2) Build a class library project called &lt;strong&gt;ServiceInterface&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Into this, I just added the following WCF marked up interface;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; ServiceInterface&lt;br /&gt;{&lt;br /&gt;[ServiceContract]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; IServeCustomers&lt;br /&gt;{&lt;br /&gt;[OperationContract]&lt;br /&gt;List&amp;lt;Customer&amp;gt; GetCustomersForCountry(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; country);&lt;br /&gt;[OperationContract]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InsertCustomers(List&amp;lt;Customer&amp;gt; customers);&lt;br /&gt;[OperationContract]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DeleteCustomers(List&amp;lt;Customer&amp;gt; before,&lt;br /&gt;List&amp;lt;Customer&amp;gt; after);&lt;br /&gt;[OperationContract]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; UpdateCustomers(List&amp;lt;Customer&amp;gt; before,&lt;br /&gt;List&amp;lt;Customer&amp;gt; after);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This references the &lt;strong&gt;DataTypes&lt;/strong&gt; project and, again, can itself &lt;br /&gt;be referenced by both my client and my service.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;3) Built a WCF service to handle &lt;strong&gt;Customer&lt;/strong&gt; instances &lt;br /&gt;(console app)&lt;/u&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is very similar to what I did in a previous post. The service code looks &lt;br /&gt;like this and references the &lt;strong&gt;ServiceInterface&lt;/strong&gt; and &lt;strong&gt;&lt;br /&gt;DataTypes&lt;/strong&gt; projects;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;namespace&lt;/span&gt; Service&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Implementation : IServeCustomers&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; List&amp;lt;Customer&amp;gt; GetCustomersForCountry(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; country)&lt;br /&gt;{&lt;br /&gt;List&amp;lt;Customer&amp;gt; customers = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (NorthwindDataContext ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NorthwindDataContext())&lt;br /&gt;{&lt;br /&gt;ctx.ObjectTrackingEnabled = &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;customers =&lt;br /&gt;(from c &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; ctx.Customers &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; c.Country == country select c).ToList();&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (customers);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InsertCustomers(List&amp;lt;Customer&amp;gt; customers)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (NorthwindDataContext ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NorthwindDataContext())&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (Customer c &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; customers)&lt;br /&gt;{&lt;br /&gt;ctx.Customers.Add(c);&lt;br /&gt;}&lt;br /&gt;ctx.SubmitChanges();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DeleteCustomers(List&amp;lt;Customer&amp;gt; before,&lt;br /&gt;List&amp;lt;Customer&amp;gt; after)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (NorthwindDataContext ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NorthwindDataContext())&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; before.Count; i++)&lt;br /&gt;{&lt;br /&gt;ctx.Customers.Attach(after[i], before[i]);&lt;br /&gt;ctx.Customers.Remove(after[i]);&lt;br /&gt;}&lt;br /&gt;ctx.SubmitChanges();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; UpdateCustomers(List&amp;lt;Customer&amp;gt; before, List&amp;lt;Customer&amp;gt; after)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (NorthwindDataContext ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; NorthwindDataContext())&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; before.Count; i++)&lt;br /&gt;{&lt;br /&gt;ctx.Customers.Attach(after[i], before[i]);&lt;br /&gt;}&lt;br /&gt;ctx.SubmitChanges();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And then I&amp;#39;ve got the hosting code;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;ServiceHost host = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ServiceHost(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(Implementation));&lt;br /&gt;host.Open();&lt;br /&gt;Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&amp;quot;Listening...&amp;quot;&lt;/span&gt;);&lt;br /&gt;Console.ReadLine();&lt;br /&gt;host.Close();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;and the config file;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;DataTypes.Properties.Settings.NorthwindConnectionString&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;connectionString&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;Data Source=.;Initial Catalog=Northwind;Integrated Security=True&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;providerName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;Service.Implementation&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;endpoint&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;net.tcp://localhost:9091/customerService&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;binding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;contract&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;ServiceInterface.IServeCustomers&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;bindingConfiguration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;myConfig&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;bindings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;netTcpBinding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;binding&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;myConfig&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;security&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;None&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;binding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;netTcpBinding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;bindings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;u&gt;4) Built a client (console app) &lt;/u&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This project references both the &lt;strong&gt;ServiceInterface &lt;/strong&gt;and&lt;br /&gt;&lt;strong&gt;DataTypes&lt;/strong&gt; project. I hand-cranked a WCF proxy class as I &lt;br /&gt;couldn&amp;#39;t remember the tool option to do it;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;  &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; ClientProxy : ClientBase&amp;lt;IServeCustomers&amp;gt;, IServeCustomers&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ClientProxy()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ClientProxy(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; config) : &lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;(config)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; List&amp;lt;Customer&amp;gt; GetCustomersForCountry(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; country)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;.Channel.GetCustomersForCountry(country));&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; InsertCustomers(List&amp;lt;Customer&amp;gt; customers)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;.Channel.InsertCustomers(customers);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; DeleteCustomers(List&amp;lt;Customer&amp;gt; before,&lt;br /&gt;List&amp;lt;Customer&amp;gt; after)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;.Channel.DeleteCustomers(before, after);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; UpdateCustomers(List&amp;lt;Customer&amp;gt; before,&lt;br /&gt;List&amp;lt;Customer&amp;gt; after)&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;base&lt;/span&gt;.Channel.UpdateCustomers(before, after);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;and then I wrote this little class to make use of the underlying &lt;strong&gt;&lt;br /&gt;DataContext&lt;/strong&gt; on the client side. &lt;strong&gt;Note - this is really a bit &lt;br /&gt;subversive and possibly a bit evil but I thought I&amp;#39;d have a play with it. &lt;br /&gt;Essentially, I&amp;#39;m trying to use the change-tracking capabilities of a DataContext &lt;br /&gt;without ever trying to connect it to a DB which is not really what you&amp;#39;re meant &lt;br /&gt;to do (AFAIK). Anyway...&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;  &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; ClientSideContext : IDisposable&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; StateEntries&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; List&amp;lt;T&amp;gt; Originals { get; set; }&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; List&amp;lt;T&amp;gt; Current { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ClientSideContext()&lt;br /&gt;{&lt;br /&gt;ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DataContext(&lt;span class=&quot;str&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; AttributeMappingSource());&lt;br /&gt;ctx.DeferredLoadingEnabled = &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Attach&amp;lt;T&amp;gt;(T t) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;ctx.GetTable&amp;lt;T&amp;gt;().Attach(t);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Remove&amp;lt;T&amp;gt;(T t) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;ctx.GetTable&amp;lt;T&amp;gt;().Remove(t);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Add&amp;lt;T&amp;gt;(T t) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;ctx.GetTable&amp;lt;T&amp;gt;().Add(t);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; List&amp;lt;T&amp;gt; GetInserted&amp;lt;T&amp;gt;() &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (GetChangeEntries&amp;lt;T&amp;gt;(ch =&amp;gt; ch.AddedEntities));&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; StateEntries&amp;lt;T&amp;gt; GetDeleted&amp;lt;T&amp;gt;() &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (GetStateEntries&amp;lt;T&amp;gt;(ch =&amp;gt; ch.RemovedEntities));&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; StateEntries&amp;lt;T&amp;gt; GetStateEntries&amp;lt;T&amp;gt;(&lt;br /&gt;Func&amp;lt;ChangeSet, IEnumerable&amp;lt;Object&amp;gt;&amp;gt; entry) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;List&amp;lt;T&amp;gt; current = GetChangeEntries&amp;lt;T&amp;gt;(entry);&lt;br /&gt;List&amp;lt;T&amp;gt; originals = GetOriginals&amp;lt;T&amp;gt;(current);&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; StateEntries&amp;lt;T&amp;gt;()&lt;br /&gt;{&lt;br /&gt;Originals = originals,&lt;br /&gt;Current = current&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; StateEntries&amp;lt;T&amp;gt; GetModified&amp;lt;T&amp;gt;() &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (GetStateEntries&amp;lt;T&amp;gt;(ch =&amp;gt; ch.ModifiedEntities));&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;{&lt;br /&gt;ctx.Dispose();&lt;br /&gt;}&lt;br /&gt;List&amp;lt;T&amp;gt; GetChangeEntries&amp;lt;T&amp;gt;(&lt;br /&gt;Func&amp;lt;ChangeSet, IEnumerable&amp;lt;Object&amp;gt;&amp;gt; selectMember) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;var query = from o &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; selectMember(ctx.GetChangeSet())&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; ((o &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; T) != &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;select (T)o;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;(query));&lt;br /&gt;}&lt;br /&gt;List&amp;lt;T&amp;gt; GetOriginals&amp;lt;T&amp;gt;(List&amp;lt;T&amp;gt; current) &lt;span class=&quot;kwrd&quot;&gt;where&lt;/span&gt; T : &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;List&amp;lt;T&amp;gt; originals = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;(&lt;br /&gt;from c &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; current&lt;br /&gt;select ctx.GetTable&amp;lt;T&amp;gt;().GetOriginalEntityState(c));&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; (originals);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; DataContext ctx;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So, the idea here is that this class contains a &lt;strong&gt;DataContext&lt;/strong&gt; &lt;br /&gt;and allows you to &lt;strong&gt;Attach, Add, Remove&lt;/strong&gt; instances to it. You can &lt;br /&gt;then come back at a later point (presumably when you want to call back to your &lt;br /&gt;middle-tier service) and you can do &lt;strong&gt;GetInserted(), GetModified(), &lt;br /&gt;GetDeleted()&lt;/strong&gt; and it&amp;#39;ll feed you the lists of objects (including &lt;br /&gt;original values and current values where necessary) to pass back to that &lt;br /&gt;middle-tier service.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here&amp;#39;s the client program code that I was playing with to try and exercise &lt;br /&gt;this;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;   &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&amp;quot;Hit return to make call...&amp;quot;&lt;/span&gt;);&lt;br /&gt;Console.ReadLine();&lt;br /&gt;ClientProxy proxy = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ClientProxy(&lt;span class=&quot;str&quot;&gt;&amp;quot;clientConfig&amp;quot;&lt;/span&gt;);&lt;br /&gt;List&amp;lt;Customer&amp;gt; customers = proxy.GetCustomersForCountry(&lt;span class=&quot;str&quot;&gt;&amp;quot;UK&amp;quot;&lt;/span&gt;);&lt;br /&gt;proxy.Close();&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (ClientSideContext ctx = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ClientSideContext())&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;foreach&lt;/span&gt; (Customer c &lt;span class=&quot;kwrd&quot;&gt;in&lt;/span&gt; customers)&lt;br /&gt;{&lt;br /&gt;ctx.Attach(c);&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// Simulate an update...&lt;/span&gt;&lt;br /&gt;c.Country = &lt;span class=&quot;str&quot;&gt;&amp;quot;GB&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// Now insert...&lt;/span&gt;&lt;br /&gt;ctx.Add(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Customer()&lt;br /&gt;{&lt;br /&gt;CustomerID = &lt;span class=&quot;str&quot;&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;,&lt;br /&gt;CompanyName = &lt;span class=&quot;str&quot;&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;&lt;br /&gt;});&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// Now delete...&lt;/span&gt;&lt;br /&gt;ctx.Remove(customers[0]);&lt;br /&gt;&lt;span class=&quot;rem&quot;&gt;// Now, call back to service...&lt;/span&gt;&lt;br /&gt;proxy = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ClientProxy(&lt;span class=&quot;str&quot;&gt;&amp;quot;clientConfig&amp;quot;&lt;/span&gt;);&lt;br /&gt;proxy.InsertCustomers(ctx.GetInserted&amp;lt;Customer&amp;gt;());&lt;br /&gt;var deleted = ctx.GetDeleted&amp;lt;Customer&amp;gt;();&lt;br /&gt;proxy.DeleteCustomers(deleted.Originals, deleted.Current);&lt;br /&gt;var modified = ctx.GetModified&amp;lt;Customer&amp;gt;();&lt;br /&gt;proxy.UpdateCustomers(modified.Originals, modified.Current);&lt;br /&gt;proxy.Close();&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Naturally, this is hacky and perhaps it would have been better to write my &lt;br /&gt;own class on the client-side rather than trying to &lt;em&gt;bend&lt;/em&gt; the &lt;strong&gt;&lt;br /&gt;DataContext&lt;/strong&gt; to do something like this but it seemed easier for what I &lt;br /&gt;was playing with so I gave it a whirl and thought I&amp;#39;d share.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;( No doubt, there are places where it&amp;#39;ll go wrong :-) ).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here&amp;#39;s the config file for the client, just for completeness;&lt;/p&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;endpoint&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;clientConfig&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;net.tcp://localhost:9091/customerService&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;binding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;contract&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;ServiceInterface.IServeCustomers&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;attr&quot;&gt;bindingConfiguration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;myConfig&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;bindings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;netTcpBinding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;binding&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;myConfig&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;security&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;None&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;binding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;netTcpBinding&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;bindings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;system.serviceModel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;</description><link>http://tareksalah.blogspot.com/2008/03/linq-to-sql-and-wcf-sharing-types.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-1245615635664264618</guid><pubDate>Thu, 06 Mar 2008 19:21:00 +0000</pubDate><atom:updated>2008-03-06T21:38:58.697+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><title>Linq To Sql POCO Support</title><description>&lt;a href=&quot;http://blogs.msdn.com/digital_ruminations/archive/2007/08/28/linq-to-sql-poco-support.aspx&quot;&gt;&lt;strong&gt;Linq To Sql POCO Support (Original Post from &lt;/a&gt;&lt;/strong&gt;&lt;a class=&quot;headermaintitle&quot; id=&quot;ctl00___ctl00___bt___BlogTitle&quot; href=&quot;http://blogs.msdn.com/digital_ruminations/default.aspx&quot;&gt;Digital Ruminations&lt;/a&gt;)&lt;strong&gt;&lt;a href=&quot;http://blogs.msdn.com/digital_ruminations/archive/2007/08/28/linq-to-sql-poco-support.aspx&quot;&gt; &lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;A colleague and I were recently discussing POCO support in Linq To Sql (LTS),&lt;br /&gt;and he pointed me to a&lt;br /&gt;&lt;a href=&quot;http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!397.entry&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color:blue;&quot;&gt;great blog post by Ian Cooper&lt;/span&gt;&lt;/a&gt; on Domain v.s.&lt;br /&gt;Data Centric design methodologies and how Linq To Sql can be used for domain&lt;br /&gt;centric development. As Ian points out, LTS places very little&lt;br /&gt;requirements on domain classes, allowing them to remain &quot;persistence ignorant&quot;.&lt;br /&gt;For example, we don&#39;t require any particular base class or interface, no&lt;br /&gt;particular constructors are required (except the default), &lt;u&gt;no special types&lt;br /&gt;are required for association members&lt;/u&gt;, etc. I don&#39;t believe the last point&lt;br /&gt;is widely known which is why I decided to make this post. The&lt;br /&gt;EntitySet&amp;lt;T&amp;gt;/EntityRef&amp;lt;T&amp;gt; classes that we codegen by default for associations&lt;br /&gt;are not required. In POCO scenarios you can map your association members&lt;br /&gt;to either List&amp;lt;T&amp;gt; or T[] like so (see the attached project for complete&lt;br /&gt;sources):&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue;&quot;&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:blue;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Order&lt;/span&gt;&amp;gt;&lt;br /&gt;_Orders;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Order&lt;/span&gt;&amp;gt;&lt;br /&gt;Orders {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue;&quot;&gt;get&lt;/span&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue;&quot;&gt;this&lt;/span&gt;._Orders;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue;&quot;&gt;set&lt;/span&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue;&quot;&gt;this&lt;/span&gt;._Orders = &lt;span style=&quot;color:blue;&quot;&gt;&lt;br /&gt;value&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;Assuming this member is mapped as an association in your external mapping file,&lt;br /&gt;LTS will treat it as such. Likewise, instead of EntityRef&amp;lt;T&amp;gt; for singleton&lt;br /&gt;associations, you will just type your member as T. Of course now that&lt;br /&gt;you&#39;re not using our association types, one of the things you lose is support&lt;br /&gt;for deferred loading. Normally during materialization Linq To Sql assigns&lt;br /&gt;deferred sources to your EntitySets/EntityRefs which upon enumeration result in&lt;br /&gt;the deferred source query being compiled and executed. In the case of POCO&lt;br /&gt;associations you&#39;ll have to explicitly specify the span to eager load - by&lt;br /&gt;default no associations will be loaded:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Northwind&lt;/span&gt; nw = &lt;span style=&quot;color:blue;&quot;&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Northwind&lt;/span&gt;(&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Northwind.sdf&quot;&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:green;&quot;&gt;// Load Customer, specifying span&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;DataLoadOptions&lt;br /&gt;ds = &lt;span style=&quot;color:blue;&quot;&gt;new&lt;/span&gt; DataLoadOptions();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;ds.LoadWith&amp;lt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;/span&gt;&amp;gt;(p&lt;br /&gt;=&amp;gt; p.Orders);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;ds.LoadWith&amp;lt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Order&lt;/span&gt;&amp;gt;(p&lt;br /&gt;=&amp;gt; p.OrderDetails);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;ds.AssociateWith&amp;lt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;/span&gt;&amp;gt;(p&lt;br /&gt;=&amp;gt; p.Orders.Where(o =&amp;gt; o.Freight &amp;gt; 20));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;nw.LoadOptions =&lt;br /&gt;ds;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;/span&gt; cust = nw.Customers.Where(p =&amp;gt;&lt;br /&gt;p.City == &lt;span style=&quot;color:#a31515;&quot;&gt;&quot;London&quot;&lt;/span&gt;).First();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;With&lt;br /&gt;the DataLoadOptions set for preloading, the materializer compiles the&lt;br /&gt;appropriate member query, executing it with the correct FK arguments for each&lt;br /&gt;row materialized. In this example, the returned customer has all of it&#39;s&lt;br /&gt;Orders with a Freight &amp;gt; 20 preloaded, and all OrderDetails for each Order are&lt;br /&gt;also preloaded.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;There&lt;br /&gt;are some other Linq To Sql features that are useful from a domain driven design&lt;br /&gt;perspective. For example, DataContext exposes &lt;b&gt;CreateDatabase&lt;/b&gt;&lt;br /&gt;functionality allowing you to generate a database from your domain model&lt;br /&gt;(expressed as a DataContext of POCO entities), as opposed to the normal method&lt;br /&gt;of using SqlMetal or the LTS Designer to generate full featured entities from&lt;br /&gt;your database (Data Centric). When coupled with our support for SqlCE,&lt;br /&gt;this is a very convenient feature:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Northwind&lt;/span&gt; nw = &lt;span style=&quot;color:blue;&quot;&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Northwind&lt;/span&gt;(&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;NewNorthwind.sdf&quot;&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:blue;&quot;&gt;if&lt;/span&gt; (!nw.DatabaseExists()) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;nw.CreateDatabase();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;/span&gt; cust = &lt;span style=&quot;color:blue;&quot;&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Customer&lt;/span&gt; { CustomerID =&lt;br /&gt;&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;MATHC&quot;&lt;/span&gt;, CompanyName =&lt;br /&gt;&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Microsoft&quot;&lt;/span&gt; };&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;nw.Customers.Add(cust);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Courier New&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;&lt;br /&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;/span&gt;nw.SubmitChanges();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;One&lt;br /&gt;other final note on POCO - as you&#39;ll notice, entities code genned by&lt;br /&gt;SqlMetal implement &lt;b&gt;INotifyPropertyChanging&lt;/b&gt;. As stated above this is&lt;br /&gt;not required, but it does allow our change tracker to be more efficient in it&#39;s&lt;br /&gt;copying of original values. For classes implementing this interface the&lt;br /&gt;change tracker subscribes to the PropertyChanging event, allowing us to put off&lt;br /&gt;copying original values until the object has actually changed. Otherwise&lt;br /&gt;we have no choice but to copy the values immediately on materialization/attach.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto&quot;&gt;&lt;br /&gt;&lt;span lang=&quot;EN&quot; style=&quot;FONT-FAMILY: &#39;Times New Roman&#39;,&#39;serif&#39;; mso-fareast-: ENfont-family:&#39;Times New Roman&#39;;&quot; &gt;In&lt;br /&gt;summary, Linq To Sql offers very good support for POCO classes, providing&lt;br /&gt;framework services to your objects in a non-invasive, loosely coupled manner.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://tareksalah.blogspot.com/2008/03/linq-to-sql-poco-support.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-463809101700913017</guid><pubDate>Thu, 06 Mar 2008 19:15:00 +0000</pubDate><atom:updated>2008-03-06T21:21:10.348+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linq to SQL</category><title>InterLINQ 0.2</title><description>&lt;p&gt;Codeplex Project &lt;a href=&quot;http://www.codeplex.com/interlinq/Release/ProjectReleases.aspx?ReleaseId=8359&quot;&gt;InterLinq 2.0&lt;/a&gt;&lt;br /&gt;implementing serialization of Expression Trees, allowing to query a remote collection exposed thru a WCF Service, serializing the query (represented in an Expression Tree), deserializing it on the server, and returning the results to the client.&lt;br /&gt;&lt;strong&gt;Features: &lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;All features of LINQ! &lt;/li&gt;&lt;li&gt;Querying of anonymous types (select new { ... } }}) &lt;/li&gt;&lt;li&gt;Communication over .NET Remoting and WCF&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Adapters&lt;br /&gt;&lt;/strong&gt;Adapters for several LINQ technologies: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;LINQ to NHibernate &lt;/li&gt;&lt;li&gt;LINQ to SQL &lt;/li&gt;&lt;li&gt;LINQ to Objects &lt;/li&gt;&lt;li&gt;LINQ to Entities (Untested)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>http://tareksalah.blogspot.com/2008/03/interlinq-02.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2095667813622285254.post-688740753170653207</guid><pubDate>Mon, 18 Feb 2008 05:01:00 +0000</pubDate><atom:updated>2008-02-18T07:03:53.277+02:00</atom:updated><title>SQL: If Exists Update Else Insert</title><description>This is a pretty common situation that comes up when performingdatabase operations.  A stored procedure is called and the data needsto be updated if it already exists and inserted if it does not.  If werefer to the Books Online documentation, it gives examples that aresimilar to:&lt;br /&gt;IF EXISTS (SELECT * FROM Table1 WHERE Column1=’SomeValue’)    UPDATE Table1 SET (…) WHERE Column1=’SomeValue’ELSE    INSERT INTO Table1 VALUES (…)&lt;br /&gt;Thisapproach does work, however it might not always be the best approach. This will do a table/index scan for both the SELECT statement and theUPDATE statement.  In most standard approaches, the following statementwill likely provide better performance.  It will only perform onetable/index scan instead of the two that are performed in the previousapproach.&lt;br /&gt;UPDATE Table1 SET (…) WHERE Column1=’SomeValue’IF @@ROWCOUNT=0    INSERT INTO Table1 VALUES (…)&lt;br /&gt;The saved table/index scan can increase performance quite a bit as the number of rows in the targeted table grows. (&lt;a href=&quot;http://msdnrss.thecoderblogs.com/2008/02/17/sql-if-exists-update-else-insert/&quot;&gt;Original&lt;/a&gt;)</description><link>http://tareksalah.blogspot.com/2008/02/sql-if-exists-update-else-insert.html</link><author>noreply@blogger.com (Tariq Salah)</author><thr:total>0</thr:total></item></channel></rss>