<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Felice Pollano Blog - QueryOver</title>
    <link>http://www.felicepollano.com/</link>
    <description>The official Fatica Labs Blog!</description>
    <language>en-us</language>
    <copyright>Felice Pollano</copyright>
    <lastBuildDate>Tue, 27 Sep 2011 10:48:57 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>felice@felicepollano.com</managingEditor>
    <webMaster>felice@felicepollano.com</webMaster>
    <item>
      <trackback:ping>http://www.felicepollano.com/Trackback.aspx?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</trackback:ping>
      <pingback:server>http://www.felicepollano.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.felicepollano.com/PermaLink.aspx?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</pingback:target>
      <dc:creator>Felice Pollano</dc:creator>
      <wfw:comment>http://www.felicepollano.com/CommentView.aspx?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</wfw:comment>
      <wfw:commentRss>http://www.felicepollano.com/SyndicationService.asmx/GetEntryCommentsRss?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://nhforge.org" target="_blank">NHibernate</a> <a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx" target="_blank">QueryOver</a> is
a new API ( from version 3.0 )  that allow to create queries the <em>ICriteria</em> way,
but with lambda expressions instead of raw strings. With QueryOver we have the benefit
of intellisense and the code is refactoring friendly. At the moment one reference
can be found on <a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx">this
blog post</a>. Something not so obvious to do is a query over a portion of a date
property, for instance all the entities in a certain month, and so on. Let’s have
an example considering this simple entity:
</p>
        <pre class="code">
          <span style="color: blue">&lt;?</span>
          <span style="color: #a31515">xml </span>
          <span style="color: red">version</span>
          <span style="color: blue">=</span>"<span style="color: blue">1.0</span>" <span style="color: red">encoding</span><span style="color: blue">=</span>"<span style="color: blue">utf-8</span>" <span style="color: blue">?&gt;
&lt;</span><span style="color: #a31515">hibernate-mapping </span><span style="color: red">xmlns</span><span style="color: blue">=</span>"<span style="color: blue">urn:nhibernate-mapping-2.2</span>" <span style="color: red">assembly</span><span style="color: blue">=</span>"<span style="color: blue">MyAssembly</span>" <span style="color: red">namespace</span><span style="color: blue">=</span>"<span style="color: blue">MyAssembly.MyNamespace</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">class </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Item</span>" <span style="color: red">table</span><span style="color: blue">=</span>"<span style="color: blue">Items</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">id </span><span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Id</span>" <span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">Int64</span>"<span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">generator </span><span style="color: red">class</span><span style="color: blue">=</span>"<span style="color: blue">native</span>"<span style="color: blue">/&gt;
&lt;/</span><span style="color: #a31515">id</span><span style="color: blue">&gt; &lt;</span><span style="color: #a31515">property </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">AnsiString</span>" <span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">Code</span>" <span style="color: red">length</span><span style="color: blue">=</span>"<span style="color: blue">32</span>"<span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">property</span><span style="color: blue">&gt;
&lt;</span><span style="color: #a31515">property </span><span style="color: red">type</span><span style="color: blue">=</span>"<span style="color: blue">DateTime</span>" <span style="color: red">name</span><span style="color: blue">=</span>"<span style="color: blue">StartDate</span>"<span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">property</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">class</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">hibernate-mapping</span><span style="color: blue">&gt; </span></pre>
        <p>
And suppose we want to fetch all the entities having start date in the year 2011,
with QueryOver we write:
</p>
        <blockquote>
          <pre class="code">
            <span style="color: blue">var </span>result = session.QueryOver&lt;<span style="color: #2b91af">Item</span>&gt;()
.Where( <span style="color: #2b91af">Restrictions</span>.Eq( <span style="color: #2b91af">Projections</span>.SqlFunction(<span style="color: #a31515">"year" </span>, <span style="color: #2b91af">NHibernateUtil</span>.Int32
, <span style="color: #2b91af">Projections</span>.Property&lt;<span style="color: #2b91af">Item</span>&gt;(item
=&gt; item.StartDate) ) ,2011)).List(); </pre>
        </blockquote>
        <a href="http://11011.net/software/vspaste">
        </a>
        <p>
          <a href="http://11011.net/software/vspaste">
          </a> 
</p>
        <p>
that yield the following query ( with MSSQL 2005 dialect ):
</p>
        <p>
SELECT<br />
        this_.Id as Id21_0_,<br />
        this_.Code as Code21_0_,<br />
        this_.StartDate as StartDate21_0_ 
<br />
    FROM<br />
        Items this_ 
<br />
    WHERE<br />
        datepart(year, this_.StartDate) = @p0;<br />
    @p0 = 2011 [Type: Int32 (0)] 
</p>
        <p>
  
</p>
        <p>
obviously we can select a projection with a portion of the date to, suppose we want
to fetch the day of all item in a certain date range, we can write:
</p>
        <pre class="code">
          <span style="color: blue">var </span>session = <span style="color: #2b91af">NHHelper</span>.Instance.CurrentSession; <span style="color: blue">var </span>result
= session.QueryOver&lt;<span style="color: #2b91af">Item</span>&gt;() .WhereRestrictionOn(k
=&gt; k.StartDate).IsBetween(dlow) .And(dup) .Select( <span style="color: #2b91af">Projections</span>.SqlFunction(<span style="color: #a31515">"day" </span>, <span style="color: #2b91af">NHibernateUtil</span>.Int32
, <span style="color: #2b91af">Projections</span>.Property&lt;<span style="color: #2b91af">Item</span>&gt;(p
=&gt; p.StartDate) )) .List&lt;<span style="color: blue">int</span>&gt;(); </pre>
        <p>
          <a href="http://11011.net/software/vspaste">
          </a> 
</p>
        <p>
obtaining the following query:
</p>
        <p>
SELECT<br />
        datepart(day,<br />
        this_.StartDate) as y0_ 
<br />
    FROM<br />
        Items this_ 
<br />
    WHERE<br />
        this_.StartDate between @p0 and @p1;<br />
    @p0 = 01/09/2011 00:00:00 [Type: DateTime (0)], @p1 = 29/09/2011
00:00:00 [Type: DateTime (0)] 
</p>
        <p>
  
</p>
        <p>
These are really common situation when we have to fill-up gui elements, and with these
tricks we can write optimal and fast queries.
</p>
        <h4>Addition:
</h4>
        <p>
As pointed by Vahid ( Thanks a lot ! ) in the comment, with the latest version ( NH
3.2 ) things are easier since there is a shortcut for dateparts as projection extension,
so the first sample became:
</p>
        <blockquote>
          <pre class="code">session.QueryOver&lt;<span style="color: #2b91af">Item</span>&gt;()
.Where( p=&gt;p.StartDate.YearPart()==2011 ).List(); </pre>
        </blockquote>
        <p>
 
</p>
        <p>
and the second one:
</p>
        <p>
 
</p>
        <pre class="code">session.QueryOver&lt;<span style="color: #2b91af">Item</span>&gt;()
.Where( p=&gt;p.StartDate.IsBetween(dlow).And(dup) ) .Select(k=&gt;k.StartDate.DayPart()
) .List(); </pre>surely better, <strong>and this is the way to go with newer NH versions</strong>,
and producing of course the same DB queries. <img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=79d4dd78-e9a2-45fe-a904-01c1bfa41439" /></body>
      <title>NHibernate QueryOver using ‘datepart’</title>
      <guid isPermaLink="false">http://www.felicepollano.com/PermaLink.aspx?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</guid>
      <link>http://www.felicepollano.com/2011/09/27/NHibernateQueryOverUsingDatepart.aspx</link>
      <pubDate>Tue, 27 Sep 2011 10:48:57 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://nhforge.org" target="_blank"&gt;NHibernate&lt;/a&gt;&amp;nbsp;&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx" target="_blank"&gt;QueryOver&lt;/a&gt; is
a new API ( from version 3.0 )&amp;nbsp; that allow to create queries the &lt;em&gt;ICriteria&lt;/em&gt; way,
but with lambda expressions instead of raw strings. With QueryOver we have the benefit
of intellisense and the code is refactoring friendly. At the moment one reference
can be found on &lt;a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx"&gt;this
blog post&lt;/a&gt;. Something not so obvious to do is a query over a portion of a date
property, for instance all the entities in a certain month, and so on. Let’s have
an example considering this simple entity:
&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1.0&lt;/span&gt;" &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;" &lt;span style="color: blue"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;hibernate-mapping &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;urn:nhibernate-mapping-2.2&lt;/span&gt;" &lt;span style="color: red"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MyAssembly&lt;/span&gt;" &lt;span style="color: red"&gt;namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MyAssembly.MyNamespace&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;class &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Item&lt;/span&gt;" &lt;span style="color: red"&gt;table&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Items&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;id &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Id&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Int64&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;generator &lt;/span&gt;&lt;span style="color: red"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;native&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;property &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;AnsiString&lt;/span&gt;" &lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Code&lt;/span&gt;" &lt;span style="color: red"&gt;length&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;32&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;property&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;property &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DateTime&lt;/span&gt;" &lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;StartDate&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;property&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;class&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;hibernate-mapping&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
And suppose we want to fetch all the entities having start date in the year 2011,
with QueryOver we write:
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;result = session.QueryOver&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;()
.Where( &lt;span style="color: #2b91af"&gt;Restrictions&lt;/span&gt;.Eq( &lt;span style="color: #2b91af"&gt;Projections&lt;/span&gt;.SqlFunction(&lt;span style="color: #a31515"&gt;"year" &lt;/span&gt;, &lt;span style="color: #2b91af"&gt;NHibernateUtil&lt;/span&gt;.Int32
, &lt;span style="color: #2b91af"&gt;Projections&lt;/span&gt;.Property&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;(item
=&amp;gt; item.StartDate) ) ,2011)).List(); &lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
that yield the following query ( with MSSQL 2005 dialect ):
&lt;/p&gt;
&lt;p&gt;
SELECT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this_.Id as Id21_0_,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this_.Code as Code21_0_,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this_.StartDate as StartDate21_0_ 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Items this_ 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datepart(year, this_.StartDate) = @p0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @p0 = 2011 [Type: Int32 (0)] 
&lt;p&gt;
&amp;nbsp; 
&lt;p&gt;
obviously we can select a projection with a portion of the date to, suppose we want
to fetch the day of all item in a certain date range, we can write:&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;session
= &lt;span style="color: #2b91af"&gt;NHHelper&lt;/span&gt;.Instance.CurrentSession; &lt;span style="color: blue"&gt;var &lt;/span&gt;result
= session.QueryOver&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;() .WhereRestrictionOn(k
=&amp;gt; k.StartDate).IsBetween(dlow) .And(dup) .Select( &lt;span style="color: #2b91af"&gt;Projections&lt;/span&gt;.SqlFunction(&lt;span style="color: #a31515"&gt;"day" &lt;/span&gt;, &lt;span style="color: #2b91af"&gt;NHibernateUtil&lt;/span&gt;.Int32
, &lt;span style="color: #2b91af"&gt;Projections&lt;/span&gt;.Property&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;(p
=&amp;gt; p.StartDate) )) .List&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;(); &lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
obtaining the following query:
&lt;/p&gt;
&lt;p&gt;
SELECT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datepart(day,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this_.StartDate) as y0_ 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Items this_ 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this_.StartDate between @p0 and @p1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @p0 = 01/09/2011 00:00:00 [Type: DateTime (0)], @p1 = 29/09/2011
00:00:00 [Type: DateTime (0)] 
&lt;p&gt;
&amp;nbsp; 
&lt;p&gt;
These are really common situation when we have to fill-up gui elements, and with these
tricks we can write optimal and fast queries.
&lt;/p&gt;
&lt;h4&gt;Addition:
&lt;/h4&gt;
&lt;p&gt;
As pointed by Vahid ( Thanks a lot ! ) in the comment, with the latest version ( NH
3.2 ) things are easier since there is a shortcut for dateparts as projection extension,
so the first sample became:
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;session.QueryOver&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;()
.Where( p=&amp;gt;p.StartDate.YearPart()==2011 ).List(); &lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
and the second one:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre class="code"&gt;session.QueryOver&amp;lt;&lt;span style="color: #2b91af"&gt;Item&lt;/span&gt;&amp;gt;()
.Where( p=&amp;gt;p.StartDate.IsBetween(dlow).And(dup) ) .Select(k=&amp;gt;k.StartDate.DayPart()
) .List(); &lt;/pre&gt;surely better, &lt;strong&gt;and this is the way to go with newer NH versions&lt;/strong&gt;,
and producing of course the same DB queries. &lt;img width="0" height="0" src="http://www.felicepollano.com/aggbug.ashx?id=79d4dd78-e9a2-45fe-a904-01c1bfa41439" /&gt;</description>
      <comments>http://www.felicepollano.com/CommentView.aspx?guid=79d4dd78-e9a2-45fe-a904-01c1bfa41439</comments>
      <category>NHibernate</category>
      <category>QueryOver</category>
    </item>
  </channel>
</rss>