# Friday, July 31, 2009

If case you did not know, Telerik released LINQ to M a few weeks ago, enabling you to use a LINQ style interface with M values of data. Mehfuz and I have written blog posts where you can see how to use the basics. 

There have been tremendous amounts of downloads and we have gotten tons of feedback. (Thanks, keep it coming!) One thing that stood out is that when you are building M values a lot of time you will have a named instance of your M code like this:

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

 

In the first version of LINQ to M, you get a runtime error saying that LINQ to M cannot parse “People”. The most current refresh of LINQ to M fixes this problem and you can run your LINQ queries against M values that have a named instance. You can get the refresh here. Enjoy!

posted on Friday, July 31, 2009 12:25:00 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Friday, July 10, 2009

I was interviewed about what I will be doing this summer on Bytes by MSDN. It was fun, and you can watch lots of others such as Scott Hanselman and Billy Hollis too.

posted on Friday, July 10, 2009 8:43:09 AM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Thursday, July 09, 2009

I chat it up with Richard and Carl about SQL Server, ADO .NET, the Entity Framework, the Boston Red Sox, LINQ to SQL, ORMs, Silverlight, Astoria, and RIA Services. Listen here.

posted on Thursday, July 09, 2009 7:38:44 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Wednesday, July 08, 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, July 08, 2009 11:31:05 AM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Tuesday, July 07, 2009

Thursday, July 16, 2009
Project Stonehenge for .NET

Subject: 
You must register at https://www.clicktoattend.com/invitation.aspx?code=139381 in order to be admitted to the building and attend.
Project Stonehenge is an open source project created to build reference applications that demonstrate the use of WS-* Standards in real-world project implementations. Project Stonehenge is sponsored by the Apache Software Foundation, a leader in the Open Source community. Project Stonehenge’s flagship application the StockTrader Application currently has interoperable layers in .NET, PHP (unmanaged-C), and JAVA.
This session will provide an overview of the WS-* standards, a history of Apache Stonehenge and the StockTrader application, an demo of the StockTrader web services interoperability, and walk-thru of the StockTrader .NET WCF code and configuration.

Speaker: 
Ben Dewey, twentysix New York
Ben Dewey is a Senior Software Developer at twentysix New York and is a committer for the Apache Incubator StoneHenge project. He has over 10 years of web development experience and has recently worked on projects using WebServices, REST, WCF, jQuery, Silverlight, and WPF. Ben strives to create connected system with well defined roles without sacrificing the richness of the user experience.

Date: 
Thursday, July 16, 2009

Time: 
Reception 6:00 PM , Program 6:15 PM

Location:  
Microsoft , 1290 Avenue of the Americas (the AXA building - bet. 51st/52nd Sts.) , 6th floor

Directions:
B/D/F/V to 47th-50th Sts./Rockefeller Ctr
1 to 50th St./Bway
N/R/W to 49th St./7th Ave.

posted on Tuesday, July 07, 2009 7:48:33 AM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Monday, July 06, 2009

Last week I did the Agile Estimation session at the NYC Agile Firestarter. Thanks to Alex Hung for taking the video and posting it!

Some back story: all the presenters were trying to out do each other in making up words. :)

Agile Estimation from Alex Hung on Vimeo.

posted on Monday, July 06, 2009 9:05:04 AM (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback