# Wednesday, 08 July 2009

I have been using Microsoft “Oslo” for some time and have been pretty excited about the ability to model an application and store it in the repository. Other developers have also gotten very excited about the ability to create domain specific languages (DSLs). DSLs are cool, because if you build a DSL on top of your application, you can abstract away some of the hard to understand stuff. You can also put in a layer on top of your standard communication (DALs, web services, etc.) For example, let’s say you work at Expedia and you want to give your providers (the airlines) a way to enter flight data to your site. You will most likely have a data entry screen with lots of boxes and drop downs. An alternative of course is a Web Service as well as a CSV text import. But another alternative is to provide a DSL, so if someone wants to go in and make a quick change, they can type:

Delta flight 280 on Friday’s new price is $780.

Then using Oslo, you can transform this to an M Value format:

Flights

{

{Carrier=”Delta”, Flight=280, DepartDate=”July 10, 2009”, Price=780}

}

This is one area where you can use Oslo with .NET today-you can call the M DSL DLLs from .NET and perform the transformation in C# or VB. The problem is that the M Value format is difficult to work with in .NET; parsing the M values can be a challenge.

Mehfuz Hossain over at Telerik built a LINQ Extender available on codeplex. Building on top that, Telerik has released a LINQ to M implementation. It is pretty easy to use. After you download it and set a reference to it in your application, you then use standard LINQ statements against M Values.

For example, let’s say that your application has some M values that looks like this:

   1:   {                
   2:           {Id=1,Name=""Stephen Forte"",Age=37},
   3:           {Id=2,Name=""Mehfuz Hossain"",Age=29},
   4:           {Id=3,Name=""Vassil Terziev"",Age=31},
   5:           {Id=4,Name=""Nadia Terziev"",Age=27},
   6:           {Id=5,Name=""Chris Sells"",Age=37},
   7:           {Id=6,Name=""Todd Anglin"",Age=27},
   8:           {Id=7,Name=""Joel Semeniuk"",Age=37},
   9:           {Id=8,Name=""Richard Campbell"",Age=42},
  10:           {Id=9,Name=""Kathleen Gurbisz"",Age=31}
  11:   }

 

You could have gotten this M code from the results of a DSL or some other process. For our purpose, we will just put it into a constant and query against it:

 

const string MGraphCode = @"

            {

               

                {Id=1,Name=""Stephen Forte"",Age=37},

                {Id=2,Name=""Mehfuz Hossain"",Age=29},

                {Id=3,Name=""Vassil Terziev"",Age=31},

                {Id=4,Name=""Nadia Terziev"",Age=27},

                {Id=5,Name=""Chris Sells"",Age=37},

                {Id=6,Name=""Todd Anglin"",Age=27},

                {Id=7,Name=""Joel Semeniuk"",Age=37},

                {Id=8,Name=""Richard Campbell"",Age=42},

                {Id=9,Name=""Kathleen Gurbisz"",Age=31}

            }";

Now you need to load the M code into a QueryContext object so you can work with it in LINQ:

   1:  var personM = QueryContext.Instance.Load(MGraphCode);

There is not a ton you can do with it just yet, but you can bind it to an ASP.NET data grid:

   1:  GridView1.DataSource = personM;
   2:  GridView1.DataBind();

This alone will save you some time, but if you want to do typed queries and have the cool IntelliSense experience, you have to strongly type your LINQ statement. To do this, create a class that has the same shape as your M data, so we will create a Person class:

   1:  public class Person
   2:  {
   3:  public int Id { get; set; }
   4:  public string Name { get; set; }
   5:  public int Age { get; set; }
   6:  }

 

Now it gets fun. Let’s create a simple LINQ statement that will query just the 37 year old people not named Joel Semeniuk:

   1:  var persons = QueryContext.Instance.Load<Person>(MGraphCode);
   2:   
   3:  var result = from person in persons
   4:                where person.Age == 37 && person.Name != "Joel Semeniuk"
   5:                orderby person.Name ascending
   6:                select person;

This will return just Chris and Stephen. You can see that we are using the standard LINQ statements FROM, WHERE, ORDERBY, and SELECT. (Hey wait a minute, aren’t those SQL operators, but I digress…. )

Let’s do some aggregation, this query will aggregate a list all of the ages and count how many people are that age, but we will exclude from our query any age that only has one person:

   1:  //Using a Group By and SUM
   2:   var result1 = from person in persons
   3:                 group person by person.Age into g                         
   4:                 where g.Count() > 1
   5:                 orderby g.Count() descending
   6:                 select new { Age = g.Key, Count = g.Count() };

Your results will look like this:

 

Age

Count

37

3

31

2

27

2

Lastly, just for the true geeks, here is how to use a LAMBDA expression:

   1:  GridView3.DataSource = QueryContext.Instance.Load<Person>(MGraphCode)
   2:                         .Where(p => p.Name == "Mehfuz Hossain");
   3:  GridView3.DataBind();

 

Mehfuz and I are pretty excited about this. There are some limitations; the M Values that you pass in has to be shaped without a name as you can see above. (Don’t worry we will change that later on.) But what you can do so far is pretty darn cool. Enjoy and drop a comment to me or Mehfuz about what you want to see in the next release.

Download it here.

posted on Wednesday, 08 July 2009 11:31:05 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
Related posts:
Mobile Apps Are Dead!
AcceleratorHK Demo Day Videos are Live!
AcceleratorHK Cohort 2 Demo Day!
AcceleratorHK Cohort 2 Week 13: Crunch Time!
AcceleratorHK Cohort 2 Week 12
AcceleratorHK Cohort 2 Week 11: Prototype Day 2!
Tracked by:
"New and Notable 339" (Sam Gentile's Blog (if (DeveloperTask == Communication &&... [Trackback]
"Teleriks crea su propia implementación de “LINQ to M”" ( Motivos de un ens... [Trackback]
"Teleriks crea su propia implementación de “LINQ to M”" (Miemblogs) [Trackback]
"LINQ To M Refresh" (Stephen Forte`s Blog) [Trackback]
"http://www.stephenforte.net/PermaLink,guid,3276f606-5673-4bf1-9520-efe4d91b4f35... [Pingback]
"Stephen Forte`s Blog - LINQ to M is available" (ElanHasson.com) [Trackback]
"Baby name meaning and origin for P" (Baby-Parenting.com) [Trackback]
"Telerik LINQ to M Refresh" (Stephen Forte`s Blog) [Trackback]
"http://www.stephenforte.net/PermaLink,guid,006f320c-bb7b-4433-90cd-e7a98e5ba847... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-2" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-3" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-4" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-5" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-6" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-7" (http://... [Pingback]
"http://d7.elanhasson.com/blogs/stephen-fortes-blog-linq-m-available-8" (http://... [Pingback]