{"id":27,"date":"2007-04-09T14:48:31","date_gmt":"2007-04-09T19:48:31","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=27"},"modified":"2013-08-13T09:38:08","modified_gmt":"2013-08-13T07:38:08","slug":"linq-declarative-and-functional-syntax","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/","title":{"rendered":"LINQ: declarative and functional syntax"},"content":{"rendered":"<p>In my last post about LINQ I shown you an example about how to use the language integrated query to select information about directories. In this post I&#8217;ll get more into the syntax and show you something about the functional querying style.<\/p>\n<p>My examples will focus on displaying information about UEFA Champions Leage winners. Thus, I have created a class called Winner that looks this this:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nclass Winner\r\n{\r\n    string  _name;\r\n    string  _country;\r\n    int     _year;\r\n\r\n    public string Name\r\n    {\r\n        get { return _name; }\r\n        set { _name = value; }\r\n    }\r\n    public string Countryr\r\n    {\r\n        get { return _country; }\r\n        set { _country = value; }\r\n    }\r\n\r\n    public int Year\r\n    {\r\n        get { return _year; }\r\n        set { _year = value; }\r\n    }\r\n\r\n    public Winner(string name, string country, int year)\r\n    {\r\n        _name = name;\r\n        _country = country;\r\n        _year = year;\r\n    }\r\n};\r\n<\/pre>\n<p><\/p>\n<p>Also I have created a utility class that returns a list (incomplete) of UCL winners:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nclass UCL\r\n{\r\n    public static IEnumerable&lt;Winner&gt; GetWinners()\r\n    {\r\n        Winner [] winners = \r\n        {\r\n            new Winner(\"Barcelona\", \"Spain\", 2006),\r\n            new Winner(\"Liverpool\", \"England\", 2005),\r\n            new Winner(\"FC Porto\", \"Portugal\", 2004),\r\n            new Winner(\"AC Milan\", \"Italy\", 2003),\r\n            new Winner(\"Real Madrid\", \"Spain\", 2002),\r\n            new Winner(\"Bayern Munchen\", \"Germany\", 2001),\r\n            new Winner(\"Real Madrid\", \"Spain\", 2000),\r\n            new Winner(\"Manchester Utd.\", \"England\", 1999),\r\n            new Winner(\"Real Madrid\", \"Spain\", 1998),\r\n            new Winner(\"Olimpique Marseille\", \"France\", 1993),\r\n        };\r\n\r\n        return winners;\r\n    }\r\n};\r\n<\/pre>\n<p><\/p>\n<p>Now, let&#8217;s see how we could display all this info ascending by the year of winning:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nIEnumerable&lt;Winner&gt; winners = UCL.GetWinners();\r\nvar result = from w in winners\r\n             orderby w.Year\r\n             select w;\r\n\r\nforeach (var w in result)\r\n{\r\n    Console.WriteLine(\"{0}\\t{1}, {2}\",\r\n            w.Year, w.Name, w.Country);\r\n}\r\n<\/pre>\n<p><\/p>\n<p>That lists the following:<\/p>\n<pre class=\"console\">\r\n1993    Olimpique Marseille, France\r\n1998    Real Madrid, Spain\r\n1999    Manchester Utd., England\r\n2000    Real Madrid, Spain\r\n2001    Bayern Munchen, Germany\r\n2002    Real Madrid, Spain\r\n2003    AC Milan, Italy\r\n2004    FC Porto, Portugal\r\n2005    Liverpool, England\r\n2006    Barcelona, Spain\r\n<\/pre>\n<p><\/p>\n<p>This SQL-like syntax is however only a &#8220;shell&#8221; over the functional syntax. It&#8217;s just like with the foreach statement. To be able to iterate with foreach, the collection must implement IEnumerable, which has a method that returns a class that implements IEnumerator. What the compiler is doing when using foreach is calling GetEnumerator to get an iterator, and then Reset() on it, and inserts a while(iterator.MoveNext()), using Current to access the current object from the collection. The same happens here with the declarative query syntax. <\/p>\n<p>Now, let&#8217;s suppose we want to list only the winners from England. What we have to do is adding a filtering:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nvar result = from w in winners\r\n             orderby w.Year\r\n             where w.Country == \"England\"\r\n             select w;\r\n<\/pre>\n<p><\/p>\n<p>What I wrote above is actually the same with:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nvar result = winners.\r\n               OrderBy(w => w.Year).\r\n               Where(w => w.Country == \"England\").\r\n               Select(w => w);\r\n<\/pre>\n<p><\/p>\n<p>Here we used the operators OrderBy, Where and Select. These are two of the query operators that allow you to perform filtering, projection and key extraction. These are built of the concept of Lambda expression, which are similar to the CLR delegates. We could rewrite the last query list this:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nFunc&lt;Winner, bool&gt; filter = w => w.Country == \"England\";\r\nFunc&lt;Winner, int&gt; criteria = w => w.Year;\r\nFunc&lt;Winner, Winner&gt; project = w => w;\r\n\r\nvar result = winners.OrderBy(criteria).Where(filter).Select(project);\r\n<\/pre>\n<p><\/p>\n<p>OrderBy and OrderByDescending are operators that impose a partial order over the keys. Operators ThenBy and ThenByDescending are used to apply additional sorting criteria by only on sorted sequences (SortedSequence<T>).<\/p>\n<p>Where is used to exclude items from the collection.<\/p>\n<p>Select and SelectMany are operators for projecting only those fields or info that is wanted.<\/p>\n<p>Now, let&#8217;s try something more complicated: grouping the winners by country, and inside each group ascending by the winning year. In declarative syntax that would be like this:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nvar result = from w in winners\r\n             orderby w.Year\r\n             group w.Name by w.Country into groups\r\n             orderby groups.Key\r\n             select groups;\r\n\r\nforeach (var w in result)\r\n{\r\n     Console.WriteLine(\"\\n{0}\", w.Key);\r\n\r\n     foreach (var e in w)\r\n     {\r\n        Console.WriteLine(\"{0}\", e);\r\n     }\r\n}\r\n<\/pre>\n<p><\/p>\n<pre class=\"console\">\r\nEnagland\r\nManchester Utd.\r\nLiverpool\r\n\r\nFrance\r\nOlimpique Marseille\r\n\r\nGermany\r\nBayern Munchen\r\n\r\nItaly\r\nAC Milan\r\n\r\nPortugal\r\nFC Porto\r\n\r\nSpain\r\nReal Madrid\r\nReal Madrid\r\nReal Madrid\r\nBarcelona\r\n<\/pre>\n<p><\/p>\n<p>In functional programming syntax, the same query is written as:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\nvar result = winners.\r\n                  OrderByDescending(w => w.Year).\r\n                  GroupBy(w => w.Country, w => w.Name).\r\n                  OrderBy(w => w.Key).\r\n                  Select(w => w);\r\n<\/pre>\n<p>\nThe GroupBy operator imposes a partitioning over a sequence of values based on a key extraction function. It returns a sequence of Grouping values, which contains both the key as well as the group of values mapped to the key. The interface of Grouping is:<\/p>\n<pre class=\"csharp\" name=\"code\">\r\npublic sealed class Grouping&lt;K, T&gt;{\r\n  public Grouping(K key, IEnumerable&lt;T&gt; group);\r\n  public Grouping();\r\n  public K Key {get; set;}\r\n  public IEnumerable&lt;T&gt; Group {get; set;}\r\n}\r\n<\/pre>\n<p><\/p>\n<p>You may wonder why the declarative syntax starts with the from clause. The SQL language has a problem, i.e. the order of clauses is not natural. Select is the first by at the time of selecting, you don&#8217;t know where do you select from. The from clause is naturally the first one, and this was rectified in LINQ. You always have to put from as the first clause in a query (when using the declarative syntax). In the functional syntax you can see you have to apply the operators on a collection, a sequence of items (in our case winners). That is the functional equivalent of from.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my last post about LINQ I shown you an example about how to use the language integrated query to select information about directories. In this post I&#8217;ll get more into the syntax and show you something about the functional querying style. My examples will focus on displaying information about UEFA Champions Leage winners. Thus, &#8230; <a title=\"LINQ: declarative and functional syntax\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/\" aria-label=\"Read more about LINQ: declarative and functional syntax\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[11,14],"tags":[],"class_list":["post-27","post","type-post","status-publish","format-standard","hentry","category-csharp","category-linq"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"LINQ: declarative and functional syntax\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2007-04-09T19:48:31+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2013-08-13T07:38:08+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"LINQ: declarative and functional syntax\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#article\",\"name\":\"LINQ: declarative and functional syntax\",\"headline\":\"LINQ: declarative and functional syntax\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2007-04-09T14:48:31+02:00\",\"dateModified\":\"2013-08-13T09:38:08+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#webpage\"},\"articleSection\":\"C#, LINQ\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"position\":4,\"name\":\".NET\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"name\":\"C#\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"position\":5,\"name\":\"C#\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#listItem\",\"name\":\"LINQ: declarative and functional syntax\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/#listItem\",\"name\":\".NET\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#listItem\",\"position\":6,\"name\":\"LINQ: declarative and functional syntax\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/net\\\/csharp\\\/#listItem\",\"name\":\"C#\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/\",\"name\":\"LINQ: declarative and functional syntax\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2007\\\/04\\\/09\\\/linq-declarative-and-functional-syntax\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2007-04-09T14:48:31+02:00\",\"dateModified\":\"2013-08-13T09:38:08+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"LINQ: declarative and functional syntax","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#article","name":"LINQ: declarative and functional syntax","headline":"LINQ: declarative and functional syntax","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2007-04-09T14:48:31+02:00","dateModified":"2013-08-13T09:38:08+02:00","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#webpage"},"articleSection":"C#, LINQ"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","position":4,"name":".NET","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","name":"C#"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","position":5,"name":"C#","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#listItem","name":"LINQ: declarative and functional syntax"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/#listItem","name":".NET"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#listItem","position":6,"name":"LINQ: declarative and functional syntax","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/#listItem","name":"C#"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/","name":"LINQ: declarative and functional syntax","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2007-04-09T14:48:31+02:00","dateModified":"2013-08-13T09:38:08+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"LINQ: declarative and functional syntax","og:url":"https:\/\/mariusbancila.ro\/blog\/2007\/04\/09\/linq-declarative-and-functional-syntax\/","article:published_time":"2007-04-09T19:48:31+00:00","article:modified_time":"2013-08-13T07:38:08+00:00","twitter:card":"summary","twitter:title":"LINQ: declarative and functional syntax"},"aioseo_meta_data":{"post_id":"27","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:04:15","updated":"2025-12-12 07:07:08","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":1,"uagb_excerpt":"In my last post about LINQ I shown you an example about how to use the language integrated query to select information about directories. In this post I&#8217;ll get more into the syntax and show you something about the functional querying style. My examples will focus on displaying information about UEFA Champions Leage winners. Thus,&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/csharp\/\" class=\"advgb-post-tax-term\">C#<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/linq\/\" class=\"advgb-post-tax-term\">LINQ<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C#<\/span>","<span class=\"advgb-post-tax-term\">LINQ<\/span>"]}},"comment_count":"1","relative_dates":{"created":"Posted 19 years ago","modified":"Updated 13 years ago"},"absolute_dates":{"created":"Posted on April 9, 2007","modified":"Updated on August 13, 2013"},"absolute_dates_time":{"created":"Posted on April 9, 2007 2:48 pm","modified":"Updated on August 13, 2013 9:38 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-r","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":2,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":1610,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/27\/revisions\/1610"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}