<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>NHibernate</title>
        <link>http://www.kowitz.net/category/21.aspx</link>
        <description>NHibernate</description>
        <language>en-AU</language>
        <copyright>Brendan Kowitz</copyright>
        <managingEditor>brendan@kowitz.net</managingEditor>
        <generator>Subtext Version 2.0.0.43</generator>
        <item>
            <title>What would NHibernate ICriteria look like in .net 3.5?</title>
            <link>http://kowitz.net/archive/2008/08/17/what-would-nhibernate-icriteria-look-like-in-.net-3.5.aspx</link>
            <description>&lt;p&gt;If NHibernate decided to ditch compatibility with plain old .net 2.0 and focus on 3.5 how would the ICriteria interface change? &lt;a href="http://www.kowitz.net/archive/2008/07/22/nhibernate-type-safety-using-lamba-expressions.aspx"&gt;Previously&lt;/a&gt; I was throwing around an idea of using a simple lambda expression to resolve the property name. Well, I couldn't help but build on this a little more. The following idea is not supposed to be LINQ, that would be far more complicated and LINQ is essentially its own interface, which is not the point. The point is, if ICriteria was written today in .net 3.5, what could it look like? How could it change?&lt;/p&gt;
&lt;p&gt;So just to recap, the original code sample looked like:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));
c.Add(Restrictions.Eq(Property.GetFor(() =&amp;gt; new Person().FirstName), "John"));&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://www.paulstovell.com/"&gt;Paul&lt;/a&gt; later come back and suggested I try using a slightly different signature so that the "Person" object doesn't need to be instantiated for no reason, this means the we can do this:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));
c.Add(Restrictions.Eq(Property.For&amp;lt;Person&amp;gt;(p =&amp;gt; p.FirstName), "John"));
&lt;/pre&gt;
&lt;p&gt;I like this a lot more. So this is the point where I started playing around and wanted to try and implement a neater way of integrating this to add Criterion. First off I tried implementing ICriteria.Add(Restrictions.Eq()) as an expression which looked like:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));
c.Add(RestrictBy.Eq&amp;lt;Person&amp;gt;(p =&amp;gt; p.FirstName == "John" ));
&lt;/pre&gt;
&lt;p&gt;That is where I got up to in the previous post. So after this I started implementing some of the other functions found on the 'Restrictions' class such as:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;.NotNull() &lt;/li&gt;
    &lt;li&gt;.IsNotNull() &lt;/li&gt;
    &lt;li&gt;.Not() &lt;/li&gt;
    &lt;li&gt;.Between() &lt;/li&gt;
    &lt;li&gt;.Gt() (Greater than) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I realized all of the above functions are able to be figured out using the syntax I already had: 'p.FirstName == "John"', so how about p.FirstName != "John", or p.ID &amp;gt; 0 or p.FirstName != null, you get the idea. This being the case, now there is no need for the Restrictions class at all, nearly everything can be figured out by using Add(). The other problem I wanted to solve was not having to keep passing the generic &amp;lt;Person&amp;gt; class in all the time. So I created a class which wraps ICriteria and keeps track of these few things, so now it looks like:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateExpression&amp;lt;Person&amp;gt;()
     .Add(p =&amp;gt; p.FirstName == "John")
     .Criteria;
&lt;/pre&gt;
&lt;p&gt;Most of the other functions on the Restrictions class can be added the same way:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateExpression&amp;lt;person&amp;gt;()
      .Add(p =&amp;gt; p.FirstName == "John") //Restriction.Eq()
      .Add(p =&amp;gt; p.LastName != null)    //Restriction.IsNotNull() 
      .Add(p =&amp;gt; p.ID &amp;gt; 0 &amp;amp;&amp;amp; p.ID &amp;lt; 1000) //Restriction.Between()
      .Criteria;&lt;/pre&gt;
&lt;p&gt;There are also other more complex things that the ICriteria interface does such as adding Projections and Joins. So how would the old AddAlias() function work? Like this perhaps:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateExpression&amp;lt;Person&amp;gt;()
      .Alias&amp;lt;Address&amp;gt;(p =&amp;gt; p.Addresses, "addr")
            .Add(a =&amp;gt; a.Postcode != null)
            .AddAndReturn(a =&amp;gt; a.Address2 == null)
      .Criteria;&lt;/pre&gt;
&lt;p&gt;Bringing it all together, here's a comparison between the old interface and the expressions version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current ICriteria:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria o = session.CreateCriteria(typeof(Person))
    .Add(Restrictions.Eq("FirstName", "John"))
    .CreateAlias("Addresses", "addr")
        .Add(Restrictions.IsNotNull("addr.Postcode"))
        .Add(Restrictions.IsNull("addr.Address2"))
    .AddOrder(Order.Asc("ID"));
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Same query using Expressions:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateExpression&amp;lt;Person&amp;gt;()
    .Add(p =&amp;gt; p.FirstName == "John")
    .Alias&amp;lt;Address&amp;gt;(p =&amp;gt; p.Addresses, "addr")
        .Add(a =&amp;gt; a.Postcode != null)
        .AddAndReturn(a =&amp;gt; a.Address2 == null)
    .OrderAsc(p =&amp;gt; p.ID)
    .Criteria;
&lt;/pre&gt;
&lt;p&gt;In conclusion, this is probably not going to revolutionize the global economy, but on some levels I think it feels a little more intuitive and a little more modern. In other respects, it's probably not much less typing then the original. Also with the up and coming linq provider, is this a waste of time? or does it complement it?&lt;/p&gt;
&lt;p&gt;Feel free to have a poke around the &lt;a href="http://code.google.com/p/systembusinessobjects/source/browse/trunk#trunk/System.BusinessObjects.Framework/Expressions"&gt;source&lt;/a&gt;, and corresponding &lt;a href="http://code.google.com/p/systembusinessobjects/source/browse/trunk/BusinessObject.Framework.Tests/RestrictionHelperTests.cs"&gt;tests&lt;/a&gt;&lt;/p&gt;&lt;img src="http://kowitz.net/aggbug/90.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2008/08/17/what-would-nhibernate-icriteria-look-like-in-.net-3.5.aspx</guid>
            <pubDate>Sun, 17 Aug 2008 05:12:29 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/90.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2008/08/17/what-would-nhibernate-icriteria-look-like-in-.net-3.5.aspx#feedback</comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/90.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/90.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate Type Safety using Lambda Expressions</title>
            <link>http://kowitz.net/archive/2008/07/22/nhibernate-type-safety-using-lamba-expressions.aspx</link>
            <description>&lt;p&gt;I can't remember if this has been around before, I do vaguely remember seeing something like it. &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;However, I just wanted to apply a snippet of code I found on &lt;a href="http://www.paulstovell.com/blog/strongly-typed-property-names"&gt;Paul's blog&lt;/a&gt; the other day to NHibernate. Of course we will definitely have type safety in queries when Linq-to-NHibernate is completed. But surely linq-to-nhibernate is not going to be the _only_ way of writing queries.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Using the original code snippet 'as is' would look something like this:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));&lt;br /&gt;c.Add(Restrictions.Eq(Property.GetFor(() =&amp;gt; new Person().FirstName), "John"));&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;This is ok, but a little long winded, so I implemented another class called RestrictBy which can break down a simple lambda expression. So now I can use:&lt;br /&gt;
&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));&lt;br /&gt;c.Add(RestrictBy.Eq(() =&amp;gt; new Person().FirstName == "John"));&lt;br /&gt;c.UniqueResult();&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;This also means you'll get compile time errors for incompatible types such as:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lamba expression error" src="http://www.kowitz.net/images/kowitz_net/nhibernate_lamba_type_error.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Using the lambda expression we get to evaluate the _actual_ property and that property's type. If you wanted to clean this up some more, its not hard to then go and add some extension methods to ICriteria to produce:&lt;/p&gt;
&lt;pre class="c-sharp" name="code"&gt;ICriteria c = session.CreateCriteria(typeof(Person));&lt;br /&gt;c.AddEq(() =&amp;gt; new Person().FirstName == "John");&lt;br /&gt;c.UniqueResult();&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;So that's it, a simple example at the moment, but it might be an option to look into a little more because the ICriteria interface is still NHibernate's native querying interface and still provides a lot of power, flexibility and programmatic building of queries.&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;Sourcecode:&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Helpers/RestrictBy.cs?r=79"&gt;RestrictBy.cs&lt;/a&gt; also a couple of unit tests &lt;a href="http://code.google.com/p/systembusinessobjects/source/browse/trunk/BusinessObject.Framework.Tests/RestrictionHelperTests.cs?r=79"&gt;here&lt;/a&gt;&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.paulstovell.com/blog/strongly-typed-property-names"&gt;Paul's Property.GetFor()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt; EDIT: &lt;/span&gt;For further reading, see the &lt;a href="http://www.kowitz.net/archive/2008/08/17/what-would-nhibernate-icriteria-look-like-in-.net-3.5.aspx"&gt;follow up&lt;/a&gt; post.&lt;img src="http://kowitz.net/aggbug/88.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2008/07/22/nhibernate-type-safety-using-lamba-expressions.aspx</guid>
            <pubDate>Mon, 21 Jul 2008 21:38:48 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/88.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2008/07/22/nhibernate-type-safety-using-lamba-expressions.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/88.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/88.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate Compatible Shared Hosts</title>
            <link>http://kowitz.net/archive/2008/03/28/nhibernate-compatible-shared-hosts.aspx</link>
            <description>&lt;p&gt;NHibernate is a remarkable ORM, however with all the magic comes a few caveats, these being the difficulties running NHibernate apps in a shared hosting environment. I'm still convinced that it's entirely possible, so I've decided to start compiling a list of success and failures that others (and myself) have had in getting things working.&lt;/p&gt;
&lt;h2&gt;Compatible Shared Hosts&lt;/h2&gt;
&lt;table width="400" cellspacing="0" cellpadding="2" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width="134" valign="top"&gt;&lt;strong&gt;Host Name&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="145" valign="top"&gt;&lt;strong&gt;Comment&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="119" valign="top"&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="134" valign="top"&gt;&lt;a href="http://www.webhost4life.com/" target="_blank"&gt;Webhost4life&lt;/a&gt; &lt;/td&gt;
            &lt;td width="157" valign="top"&gt;Reportedly works with "no hacks"&lt;/td&gt;
            &lt;td width="151" valign="top"&gt;[&lt;a href="http://www.gavaghan.org/blog/2007/08/21/nhibernate-in-a-medium-trust-environment/" target="_blank"&gt;ref&lt;/a&gt;]&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="vertical-align: top;"&gt;&lt;a href="http://www.discountasp.net/" target="_blank"&gt;DiscountAsp&lt;/a&gt;&lt;/td&gt;
            &lt;td style="vertical-align: top;"&gt;I think this should work with IIS7 / Win 2008&lt;/td&gt;
            &lt;td style="vertical-align: top;"&gt;[&lt;a href="http://kb.discountasp.net/article.aspx?id=10574"&gt;ref&lt;/a&gt;]&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="vertical-align: top;"&gt;&lt;a href="http://www.xhostsolutions.com/" target="_blank"&gt;XHostSolutions&lt;/a&gt;&lt;/td&gt;
            &lt;td style="vertical-align: top;"&gt;Simply email support and ask to have your application run as Full Trust&lt;br /&gt;
            &lt;/td&gt;
            &lt;td style="vertical-align: top;"&gt; This is the host I use.&lt;br /&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Shared Hosts known &lt;strong&gt;not&lt;/strong&gt; to work&lt;/h2&gt;
&lt;table width="400" cellspacing="0" cellpadding="2" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width="132" valign="top"&gt;&lt;strong&gt;Host Name&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="133" valign="top"&gt;&lt;strong&gt;Comment&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="133" valign="top"&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="132" valign="top"&gt;&lt;a href="http://www.godaddy.com/" target="_blank"&gt;Godaddy&lt;/a&gt; &lt;/td&gt;
            &lt;td width="149" valign="top"&gt; &lt;/td&gt;
            &lt;td width="165" valign="top"&gt;[&lt;a href="http://forum.hibernate.org/viewtopic.php?t=980538&amp;amp;highlight=medium+trust" target="_blank"&gt;ref&lt;/a&gt;]&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="132" valign="top"&gt;&lt;a href="http://www.crystaltech.com/" target="_blank"&gt;Crystaltech&lt;/a&gt; &lt;/td&gt;
            &lt;td width="149" valign="top"&gt; &lt;/td&gt;
            &lt;td width="165" valign="top"&gt;
            &lt;p&gt;[&lt;a href="http://forum.castleproject.org/viewtopic.php?t=3104" target="_blank"&gt;ref&lt;/a&gt;]&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Untested / Unknown&lt;/h2&gt;
&lt;table width="400" cellspacing="0" cellpadding="2" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width="133" valign="top"&gt;&lt;strong&gt;Host Name&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="133" valign="top"&gt;&lt;strong&gt;Comment&lt;/strong&gt;&lt;/td&gt;
            &lt;td width="133" valign="top"&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="133" valign="top"&gt;&lt;a href="http://www.discountasp.net/" target="_blank"&gt;DiscountAsp&lt;/a&gt;&lt;/td&gt;
            &lt;td width="133" valign="top"&gt; &lt;/td&gt;
            &lt;td width="133" valign="top"&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Useful References / Alternate Ideas&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://blechie.com/WPierce/archive/2008/02/17/Lazy-Loading-with-nHibernate-Under-Medium-Trust.aspx"&gt;Lazy Loading with nHibernate Under Medium Trust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://kowitz.net/aggbug/84.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2008/03/28/nhibernate-compatible-shared-hosts.aspx</guid>
            <pubDate>Fri, 28 Mar 2008 13:21:04 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/84.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2008/03/28/nhibernate-compatible-shared-hosts.aspx#feedback</comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/84.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/84.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET Databinding lazy properties</title>
            <link>http://kowitz.net/archive/2007/12/19/asp.net-databinding-lazy-properties.aspx</link>
            <description>&lt;p&gt;Every since using NHibernate, the effort required to use Many-to-many and one-to-many joins in business objects is a brainless exercise. When using a lazy loaded property on a business object, it just works, however, what happens when you try to bind this property using an ObjectDataSource hooked up to gridview or formview in asp.net...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_4.png"&gt;&lt;img width="646" height="199" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_thumb_1.png" alt="image" style="border: 0px none ;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As seen above, the GridView works out that it's out of it's depth with all the complex properties and only defines the simple text/int/boolean columns. The only alternative for the complex properties is to define your own template columns. &lt;/p&gt;
&lt;p&gt;To display the value of a complex property you are still able to access the sub-properties using the Eval() command. So in the example below, I can use Eval() to display the name of the 'parent location' that is currently selected. To actually select the location, I can bind it the a custom user control using the Bind() method, this will pass in the entire lazy loaded 'Location' object. The user control must then pass back out a Location object when the ObjectDataSource needs to do an update.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_6.png"&gt;&lt;img width="739" height="136" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_thumb_2.png" alt="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;After making this change my grid now has the lazy loaded 'Parent Location' property:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_2.png"&gt;&lt;img width="643" height="214" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_thumb.png" alt="image" style="border: 0px none ;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;When the grid is in action, view mode:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_8.png"&gt;&lt;img width="648" height="77" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_thumb_3.png" alt="image" style="border: 0px none ;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Edit mode:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_10.png"&gt;&lt;img width="650" height="118" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/ASP.NETDatabindinglazyproperties_1D5/image_thumb_4.png" alt="image" style="border: 0px none ;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Although this is a relatively simple example, it does show how much code you don't need to write to do a one-to-many join using binding in asp.net 2.0.&lt;/p&gt;&lt;img src="http://kowitz.net/aggbug/81.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2007/12/19/asp.net-databinding-lazy-properties.aspx</guid>
            <pubDate>Tue, 18 Dec 2007 20:38:24 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/81.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2007/12/19/asp.net-databinding-lazy-properties.aspx#feedback</comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/81.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/81.aspx</trackback:ping>
        </item>
    </channel>
</rss>