{"id":5323,"date":"2007-10-17T13:20:00","date_gmt":"2007-10-17T13:20:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2007\/10\/17\/linq-cookbook-recipe-9-dynamic-sort-order-doug-rothaus\/"},"modified":"2024-07-05T14:39:42","modified_gmt":"2024-07-05T21:39:42","slug":"linq-cookbook-recipe-9-dynamic-sort-order-doug-rothaus","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/linq-cookbook-recipe-9-dynamic-sort-order-doug-rothaus\/","title":{"rendered":"LINQ Cookbook, Recipe 9: Dynamic Sort Order (Doug Rothaus)"},"content":{"rendered":"<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">Ingredients:<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoListParagraph\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\"><span>Visual Studio 2008 (Beta2 or Higher)<\/span><span><\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\"><b><span>Categories:<\/span><\/b><span> LINQ-To-XML<\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">Introduction:<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">You can use the <b>Order By<\/b> clause to easily sort the results of a LINQ query in Visual Basic. A common requirement for sorted data, however, is that the user be able to choose the fields that the results are sorted by. The <b>Order By<\/b> clause requires that you specify a static list of sort fields and sort directions, so how do you specify a sort order when you don&rsquo;t know which fields the user has chosen until run time? The solution is to use the <b>OrderBy<\/b> or <b>OrderByDescending<\/b> query methods of the <b>Queryable<\/b> or <b>Enumerable<\/b> class.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Here&rsquo;s how it works: The <b>OrderBy<\/b> or <b>OrderByDescending<\/b> methods can be applied to any LINQ query. The input to the <b>OrderBy<\/b> or <b>OrderByDescending<\/b> methods is either a Lambda expression, or the address of a custom function. The Lambda expression or custom function evaluate an instance of the range variable for the current query scope and return a value to be used when sorting. For example, if the range variable is a <\/font><\/span><span>Customer<\/span><span><font face=\"Calibri\"> object that has <\/font><\/span><span>FirstName<\/span><span><font face=\"Calibri\"> and <\/font><\/span><span>LastName<\/span><span><font face=\"Calibri\"> properties, you can create a function called <\/font><\/span><span>GetSortValue<\/span><span><font face=\"Calibri\"> that takes, as input, a <\/font><\/span><span>Customer<\/span><span><font face=\"Calibri\"> object and returns the value for either the <\/font><\/span><span>FirstName<\/span><span><font face=\"Calibri\"> or <\/font><\/span><span>LastName<\/span><span><font face=\"Calibri\"> property value, based on which field the user selected to sort by.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">This recipe shows how to create a custom function to provide values to be used when sorting a LINQ query.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">Instructions:<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoListParagraphCxSpFirst\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">Create a new Windows Forms Application in Visual Basic. Set the <b>Size<\/b> of the default <b>Form<\/b>, <\/font><\/span><span>Form1<\/span><span><font face=\"Calibri\">, to <\/font><\/span><span>800, 600<\/span><span><font face=\"Calibri\">.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">From the <b><span>Toolbox<\/span><\/b>, drag a <b>WebBrowser<\/b> control onto the form. The name of the <b>WebBrowser<\/b> control will default to <\/font><\/span><span>WebBrowser1<\/span><span><font face=\"Calibri\">. In the <b><span>WebBrowser Tasks<\/span><\/b> panel, select <b><span>Undock in parent container<\/span><\/b> and resize the <b>WebBrowser<\/b> control to make room for two <b>Label<\/b> controls on the form.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">From the <b><span>Toolbox<\/span><\/b>, drag a <b>Label<\/b> control onto the form. Set the <b>Text<\/b> property of the <b>Label<\/b> control to <\/font><\/span><span>Date<\/span><span><font face=\"Calibri\">. The name of the <b>Label<\/b> control will default to <\/font><\/span><span>Label1<\/span><span><font face=\"Calibri\">.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpMiddle\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">From the <b><span>Toolbox<\/span><\/b>, drag another <b>Label<\/b> control onto the form. Set the <b>Text<\/b> property of the Label control to <\/font><\/span><span>Title<\/span><span><font face=\"Calibri\">. The name of the <b>Label<\/b> control will default to <\/font><\/span><span>Label2<\/span><span><font face=\"Calibri\">.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraphCxSpLast\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">Right-click the <b>Form<\/b> and select <b><span>View Code<\/span><\/b>.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">At this point, you will add a method that your application will use to retrieve an RSS feed to use as data to be sorted, and another method that will format the query results as a\nn HTML document to be displayed using the <b>WebBrowser<\/b> control.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>&middot;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">In the <\/font><\/span><span>Form1<\/span><span><font face=\"Calibri\"> class, add the following code.<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>Private<\/span> rss <span>As<\/span> XElement<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&#8216; GetRssDocument: Retrieves an RSS XML document from a supplied URL.<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>Private<\/span> <span>Function<\/span> GetRssDocument(<span>ByVal<\/span> url <span>As<\/span> <span>String<\/span>) <span>As<\/span> XElement<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> request = Net.WebRequest.Create(url)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> response = request.GetResponse()<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> reader = Xml.XmlReader.Create(response.GetResponseStream())<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>reader.MoveToContent()<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> rssDoc = XDocument.ReadFrom(reader)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>reader.Close()<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>response.Close()<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Return<\/span> rssDoc<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>End<\/span> <span>Function<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&#8216; GetHtmlDocument: Returns HTML transformed from a list of XML elements from<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&#8216;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>an RSS feed.<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>Private<\/span> <span>Function<\/span> GetHtmlDocument(<span>ByVal<\/span> items <span>As<\/span> IEnumerable(<span>Of<\/span> XElement))<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> htmlDoc = <span>&lt;<\/span><span>html<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&amp;nbsp\n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>head<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>style<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>td {font-family:verdana;font-size:12px}<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><span>style<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><span>head<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>body<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>table<\/span> <span>border<\/span><span>=<\/span><span>&#8220;<\/span><span>0<\/span><span>&#8220;<\/span> <span>cellspacing<\/span><span>=<\/span><span>&#8220;<\/span><span>2<\/span><span>&#8220;<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;%=<\/span> _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>From<\/span> item <span>In<\/span> items _<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Select<\/span> <span>&lt;<\/span><span>tr<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>td<\/span> <span>style<\/span><span>=<\/span><span>&#8220;<\/span><span>width:480<\/span><span>&#8220;<\/span><span>&gt;&lt;<\/span><span>b<\/span><span>&gt;<\/span><span>&lt;%=<\/span> item.<span>&lt;<\/span>title<span>&gt;<\/span>.Value <span>%&gt;<\/span><span>&lt;\/<\/span><span>b<\/span><span>&gt;&lt;\/<\/span><span>td<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>td<\/span><span>&gt;<\/span><span>&lt;%=<\/span> item.<span>&lt;<\/span>pubDate<span>&gt;<\/span>.Value <span>%&gt;<\/span><span>&lt;\/<\/span><span>td<\/span><span>&gt;<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><\/span><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ingredients: &middot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visual Studio 2008 (Beta2 or Higher) &nbsp; Categories: LINQ-To-XML &nbsp; Introduction: You can use the Order By clause to easily sort the results of a LINQ query in Visual Basic. A common requirement for sorted data, however, is that the user be able to choose the fields that the results are sorted by. [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[192,195],"tags":[59,93,94,117,166],"class_list":["post-5323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured","category-visual-basic","tag-doug-rothaus","tag-linq-cookbook","tag-linqvb9","tag-orcas","tag-vb2008"],"acf":[],"blog_post_summary":"<p>Ingredients: &middot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Visual Studio 2008 (Beta2 or Higher) &nbsp; Categories: LINQ-To-XML &nbsp; Introduction: You can use the Order By clause to easily sort the results of a LINQ query in Visual Basic. A common requirement for sorted data, however, is that the user be able to choose the fields that the results are sorted by. [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/5323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=5323"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/5323\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=5323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=5323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=5323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}