<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Mehfuz's WebLog : OpenLinqToSql</title><link>http://weblogs.asp.net/mehfuzh/archive/tags/OpenLinqToSql/default.aspx</link><description>Tags: OpenLinqToSql</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Article of the day at Asp.net</title><link>http://weblogs.asp.net/mehfuzh/archive/2008/01/22/article-of-the-day-at-asp-net.aspx</link><pubDate>Tue, 22 Jan 2008 06:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5633366</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=5633366</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/01/22/article-of-the-day-at-asp-net.aspx#comments</comments><description>&lt;P&gt;My &lt;A href="http://dotnetslackers.com/articles/csharp/CreatingCustomLINQProviderUsingLinqExtender.aspx" mce_href="http://dotnetslackers.com/articles/csharp/CreatingCustomLINQProviderUsingLinqExtender.aspx"&gt;Creating custom LINQ provider using LinqExtender&lt;/A&gt; is article of the day at &lt;A href="http://www.asp.net/" mce_href="http://www.asp.net/"&gt;asp.net&lt;/A&gt;. Those of you haven't check that out yet, I would suggest to have a look, it shows the easiest way of creating LINQ providers without any &lt;EM&gt;Expression&lt;/EM&gt; parsing knowledge.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ArticleofthedayatAsp.net_10E3F/image_2.png" mce_href="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ArticleofthedayatAsp.net_10E3F/image_2.png"&gt;&lt;IMG alt=image src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ArticleofthedayatAsp.net_10E3F/image_thumb.png" width=389 height=271 mce_src="http://weblogs.asp.net/blogs/mehfuzh/WindowsLiveWriter/ArticleofthedayatAsp.net_10E3F/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Have Fun!!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5633366" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/OpenLinqToSql/default.aspx">OpenLinqToSql</category></item><item><title>[New Article] Creating custom LINQ provider using LinqExtender</title><link>http://weblogs.asp.net/mehfuzh/archive/2008/01/08/new-article-creating-custom-linq-provider-using-linqextender.aspx</link><pubDate>Mon, 07 Jan 2008 23:32:39 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5565950</guid><dc:creator>mehfuzh</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=5565950</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2008/01/08/new-article-creating-custom-linq-provider-using-linqextender.aspx#comments</comments><description>&lt;p&gt;First of all happy new year, secondly my new article is just published at Dotnetslackers. This explains the detail of creating custom LINQ providers using Linqextender. &lt;/p&gt; &lt;p&gt;You can check that out at &lt;a title="http://dotnetslackers.com/articles/csharp/CreatingCustomLINQProviderUsingLinqExtender.aspx" href="http://dotnetslackers.com/articles/csharp/CreatingCustomLINQProviderUsingLinqExtender.aspx"&gt;http://dotnetslackers.com/articles/csharp/CreatingCustomLINQProviderUsingLinqExtender.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Moreover, I would like to add some tiny enhancements to the extender.&lt;/p&gt; &lt;p&gt;1. All the extender descendant can now do something like.&lt;/p&gt;&lt;pre class="csharpcode"&gt;var query = (from q &lt;span class="kwrd"&gt;in&lt;/span&gt; _queryContext
             orderby q.LastUpdated descending
             select &lt;span class="kwrd"&gt;new&lt;/span&gt; { q.Id, q.Title, q.LastUpdated }).Take(1);
 
&lt;span class="kwrd"&gt;int&lt;/span&gt; count = query.Count(); &lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&lt;font face="Tahoma"&gt;2. OpenLinqToSql, which is a part of &lt;a href="http://www.codeplex.com/LINQExtender"&gt;Linqextender&lt;/a&gt;, now, supports SQLCE database.&lt;/font&gt;&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Tahoma"&gt;3. Easy OnError event for exception trapping.&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;In the end, there are plenty of things that needs to done and to be told, but the article explains exactly how to get started and create a provider in no time. Please take a look , and if possible give some votes.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f01%2f08%2fnew-article-creating-custom-linq-provider-using-linqextender.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2008%2f01%2f08%2fnew-article-creating-custom-linq-provider-using-linqextender.aspx" border="0"&gt;&lt;/a&gt; &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5565950" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/VS2008/default.aspx">VS2008</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/OpenLinqToSql/default.aspx">OpenLinqToSql</category></item><item><title>LinqExtender 1.2 is out now</title><link>http://weblogs.asp.net/mehfuzh/archive/2007/12/25/linqextender-1-2-is-out-now.aspx</link><pubDate>Mon, 24 Dec 2007 20:31:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5497506</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=5497506</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2007/12/25/linqextender-1-2-is-out-now.aspx#comments</comments><description>&lt;p&gt;Since, the first release of LinqExtender, I found quite a bit download and feedback from community around. I did plenty of changes and tried to make it as simple as possible for&amp;nbsp; creating custom providers,&amp;nbsp; without knowing a bit of reflection and expression parsing of the core framework.&lt;/p&gt; &lt;p&gt;After the release , I was asked by people around , why do we need Linq , when we can do it by method calls, the answer is, Linq gives another level of abstraction to method call that enables you to set a query domain for developers, by means of strongly type query objects, it's not like exposing the data access layer to the front end developer, but it is like giving them a playground with proper boundary. In other words, front end developers now can query on some specific criteria&amp;nbsp; that we set by means of query object , still giving them a flexibility of functional programming.&lt;/p&gt; &lt;p&gt;Now on to the release 1.2. it has come with query info retrieval wrapper and some new features ,which could be useful while making custom providers.&lt;/p&gt; &lt;p&gt;I have mentioned in following post, how query data is delegated to &lt;u&gt;Process&lt;/u&gt; routine, that will be overridden in the custom provider that developer is working on.&lt;/p&gt; &lt;p&gt;&lt;a title="http://weblogs.asp.net/mehfuzh/archive/2007/12/02/linqextender.aspx" href="http://weblogs.asp.net/mehfuzh/archive/2007/12/02/linqextender.aspx"&gt;http://weblogs.asp.net/mehfuzh/archive/2007/12/02/linqextender.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now with new release it looks something like&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Process(LinqExtender.Interface.IModify&amp;lt;T&amp;gt; items, Bucket bucket)&lt;/pre&gt;
&lt;p&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
As , you can see that it has &lt;u&gt;Bucket&lt;/u&gt; object, which is nothing but a wrapper for holding the query details. Each Bucket has some BucketItem. BucketItem contains info for each property used in the expression&amp;nbsp; separated by &amp;amp;&amp;amp;.&lt;/p&gt;
&lt;p&gt;Typically &lt;u&gt;BucketItem&lt;/u&gt; looks like&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;BucketItem&lt;/u&gt;&lt;br&gt;Name&lt;/strong&gt; - Property name, different if the used with OriginalFieldNameAttribute, or less it is same as property name. &lt;br&gt;&lt;strong&gt;Value&lt;/strong&gt; - value in the query , for which the property is compared. Default value, Null.&lt;br&gt;&lt;strong&gt;Unique&lt;/strong&gt; - True , if UniqueIdentifierAttribute or its inherited type is used on property.Here, one can Use UniqueIdentifierAttribute directly on property or can use any inherited form like, PrimaryKeyAttribute that inherits the UniqueIdentifierattribute, to reflect value to this property.&lt;br&gt;&lt;strong&gt;RelationType&lt;/strong&gt; : Enum - Equal , LessThan, LessThatEqual, GreaterThan, GreaterThanEqual. Used to identify which type of logical comparison is used.&lt;/p&gt;
&lt;p&gt;Any of the property, which is not used in a query , BucketItem.Value and BucketItem.RelationType will have the default value for it, which is Null and Equal respectively.&lt;/p&gt;
&lt;p&gt;Now, Going Back to Bucket, it looks like&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Bucket&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;IDictionary&amp;lt;string, BucketItem&amp;gt; Items&lt;/strong&gt; - List of items for property,&amp;nbsp; where &lt;u&gt;string&lt;/u&gt; is the property name of the query object, BuckItem represents how the Property is treated and used in query. &lt;br&gt;&lt;strong&gt;ItemsToTake&lt;/strong&gt; - default null , if &lt;u&gt;Take&lt;/u&gt; is not specified in query.&lt;br&gt;&lt;strong&gt;ItemsToTake&lt;/strong&gt; - default 0, if &lt;u&gt;Skip&lt;/u&gt; is not specified in query.&lt;br&gt;&lt;strong&gt;UniqueItems&lt;/strong&gt; - string[], contains the name of property on which UniqueIdentifierAttribute or its derivative is applied. 
&lt;p&gt;As, we can see from this release that Linqextender supports most common logical expression rather than just Equal expression. 
&lt;p&gt;The new release also supports&amp;nbsp; "New Type" queries, which i already mentioned in this post 
&lt;p&gt;&lt;a title="http://weblogs.asp.net/mehfuzh/archive/2007/12/16/anonymous-type-in-linqextender.aspx" href="http://weblogs.asp.net/mehfuzh/archive/2007/12/16/anonymous-type-in-linqextender.aspx"&gt;http://weblogs.asp.net/mehfuzh/archive/2007/12/16/anonymous-type-in-linqextender.aspx&lt;/a&gt; 
&lt;p&gt;Finally, I have added CTE(Common table expression) generation for OpenLinqToSql (Formerly known as TinyLinqToSql) provider. 
&lt;p&gt;Now , queries like the following with Take and Skip&lt;pre class="csharpcode"&gt;SqlQuery&amp;lt;Book&amp;gt; context = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlQuery&amp;lt;Book&amp;gt;();&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;var query = (from q &lt;span class="kwrd"&gt;in&lt;/span&gt; _queryContext
             orderby q.LastUpdated ascending
             select q).Take(5).Skip(2);&lt;/pre&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// this is where the query will execute&lt;/span&gt;
&lt;span class="kwrd"&gt;foreach&lt;/span&gt;(var book &lt;span class="kwrd"&gt;in&lt;/span&gt; query)
{
 &lt;span class="rem"&gt;// do something useful &lt;/span&gt;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Will generate Sql like...&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;WITH&lt;/span&gt; FilteredList(Id,Author,Title,ISBN,LastUpdated, [RowNumber]) &lt;span class="kwrd"&gt;AS&lt;/span&gt;(
&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; Id,Author,Title,ISBN,LastUpdated, Row_number()&lt;span class="kwrd"&gt;OVER&lt;/span&gt;(&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; 
LastUpdated &lt;span class="kwrd"&gt;asc&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; [RowNumber] &lt;span class="kwrd"&gt;FROM&lt;/span&gt; Book 
)&lt;span class="kwrd"&gt;Select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; FilteredList &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [Rownumber] &lt;span class="kwrd"&gt;Between&lt;/span&gt; (3) &lt;span class="kwrd"&gt;and&lt;/span&gt; (7)&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Here, Take(5), Skip(2), it will take 5 items starting from 3.&lt;/p&gt;
&lt;p&gt;For more, I would suggest to have a look at release page of &lt;a href="http://www.codeplex.com/LINQExtender"&gt;LinqExtender&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OpenLinqToSql provider is made to exercise the LinqExtender engine , it is provided with the LinqExtender source and with NUnit test class in LinqExtender project itself. There is another project named &lt;a href="http://www.codeplex.com/LINQFlickr"&gt;Linq.Flickr&lt;/a&gt;, where I have originally started working on with Linq provider and then made LinqExtender, this is currently a separate project. This shows another&amp;nbsp; possible implementation of LinqExtender, for service end points.&lt;/p&gt;
&lt;p&gt;Happy Holidays!!!&lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2007%2f12%2f25%2flinqextender-1-2-is-out-now.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2007%2f12%2f25%2flinqextender-1-2-is-out-now.aspx" border="0"&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5497506" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/Linq.Flickr/default.aspx">Linq.Flickr</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/OpenLinqToSql/default.aspx">OpenLinqToSql</category></item><item><title>LinqExtender 1.01 released</title><link>http://weblogs.asp.net/mehfuzh/archive/2007/12/10/linqextender-1-01-released.aspx</link><pubDate>Mon, 10 Dec 2007 15:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5432222</guid><dc:creator>mehfuzh</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mehfuzh/rsscomments.aspx?PostID=5432222</wfw:commentRss><comments>http://weblogs.asp.net/mehfuzh/archive/2007/12/10/linqextender-1-01-released.aspx#comments</comments><description>&lt;p&gt;I have released the new version of &lt;a href="http://www.codeplex.com/LINQExtender"&gt;LinqExtender&lt;/a&gt;,&amp;nbsp; it now support orderby queries &lt;/p&gt; &lt;p&gt;Like I can easily do&lt;/p&gt; &lt;p&gt;var query = from q &lt;span class="kwrd"&gt;in&lt;/span&gt; context &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;where&lt;/span&gt; q.Id == 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderby q.Id descending&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select q;&lt;br&gt;&lt;/p&gt; &lt;p&gt;Also, I have uploaded a tiny linq to sql project named OpenLinqToSql which is built on &lt;a href="http://www.codeplex.com/LINQExtender"&gt;LinqExtender&lt;/a&gt; and can be downloaded from &lt;a href="http://www.codeplex.com/LINQExtender"&gt;LinqExtender&lt;/a&gt; release page&lt;/p&gt; &lt;p&gt;To start working with OpenLinqToSql, all is needed.&lt;/p&gt; &lt;p&gt;First create a object that represents the entity class.For example , i have created a Book table in database , which looks like &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; [dbo].[Book](
    [ID] [&lt;span class="kwrd"&gt;int&lt;/span&gt;] &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
    [Author] [nvarchar](255) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
    [Title] [nvarchar](255) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
    [ISBN] [nvarchar](50) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,
    [LastUpdated] datetime &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;

)
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;For which the representation of object is &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Book : QueryObjectBase
    {
        [LinqVisible, Identity]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;? Id { get; set; }
        [LinqVisible]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Author { get; set; }
        [LinqVisible]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }
        [LinqVisible]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ISBN { get; set; }
        [LinqVisible]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime? LastUpdated {get; set;} 

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsNew
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; Id == &lt;span class="kwrd"&gt;null&lt;/span&gt;;
            }
        }
    }&lt;/pre&gt;
&lt;p&gt;Here to note that, in order to use a property in query expression, LinqVisibleattribute is used. Also, Non string properties, should be made Nullable. &lt;/p&gt;
&lt;p&gt;Finally, I can do the following to get things going&lt;/p&gt;
&lt;p&gt;SqlQuery&amp;lt;Book&amp;gt; context = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlQuery&amp;lt;Book&amp;gt;(); &lt;/p&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Write the query. &lt;pre class="csharpcode"&gt;var query = from q &lt;span class="kwrd"&gt;in&lt;/span&gt; context
            orderby q.Id descending
            select q;

&lt;/pre&gt;
&lt;p&gt;The OpenLinqToSql can talk with SQLCE databases as well. Also, this is just an tiny project that helps to understand how to make providers using &lt;a href="http://www.codeplex.com/LINQExtender"&gt;LinqExtender&lt;/a&gt;, but for real flavor , use the LinqToSql that comes with .net 3.5&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2007%2f12%2f10%2flinqextender-1-01-released.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fmehfuzh%2farchive%2f2007%2f12%2f10%2flinqextender-1-01-released.aspx" border="0"&gt;&lt;/a&gt; 
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5432222" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/LinqExtender/default.aspx">LinqExtender</category><category domain="http://weblogs.asp.net/mehfuzh/archive/tags/OpenLinqToSql/default.aspx">OpenLinqToSql</category></item></channel></rss>