Archive for the ‘LINQ’ category

Fantastic Friday – Links, thoughts and more…!

December 4th, 2009

Happy Friday to you  :)   I’m looking forward to my employer’s (Strategic Data Systems) Christmas party tommorow night.  It’s always a fun time.

SquareUp by Twitter

http://squareup.com/
Twitter founder formally unveils ‘Square’ project  – this is pretty cool I think – the ability to have “mobile-payments”.  

Here is a description:

The Square hardware is a small, inexpensive card reader that plugs into the audio jack of a compatible device, including a mobile phone (it’s starting with the iPhone and currently has job postings up for BlackBerry and Android engineers). It processes credit card payments, geotags their locations on a map, and e-mails a receipt to the buyer.

I think it’s a great idea – pretty cool stuff. 

Visual NHibernate Beta

At first I thought this might be ‘free’  :)   But it’s not.  However, I must say, it’s looking very nice.  Based on some NH google lists the developer(s) are very responsive to adding features and bug fixes.  That was good to see.  One of the ‘complaints’ that I hear sometimes about NHibernate (vs. like EF, L2S, or commercial ORMs) is that it’s complex to get up and running if your not familiar with how mapping files, etc… work.   So Visual NHibernate provides a visual designer and mapping tool for creating and editing NHibernate projects.

Ryan Cromwell – Castle Windsor

Not sure if I blogged on this before (yeah… I know I can search…) but I really like working with Castle Windsor’s Inversion of control container.  Ryan Cromwell (fellow contractor at Strategic Data Systems) provides a couple of good blog posts on it’s usage.  I was recently asked about factory facility for Windsor, and I was able to refer that person to Ryan’s post (see ‘Injecting WCF Channel as Dependency..’ below)

Strategy Pattern with Castle Windsor (he includes a sample project – thanks Ryan!)

Registering WPF “Views” with Windsor Fluent API

Injecting a WCF Channel as Dependency via Windsor – this shows off the Factory facility for Windsor.

By the way – a plug for Ryan:  He is our TFS specialist and can help setup, provide guidance, etc… for TFS.  If your looking for someone to do that for you – he is definitely the man to get!  I should add, he is a heck of a WPF programmer as well – he does some really fine work!

MVC Turbine – Plugin for ASP.NET MVC

http://mvcturbine.codeplex.com/

From CodePlex:

MVC Turbine is a plugin for ASP.NET MVC that has IoC baked in and auto-wires controllers, binders, view engines, http modules, etc. that reside within your application. Thus you worry more about what your application should do, rather than how it should do it.

This is very good to see from my perspective.  One of the features I really enjoyed while experimenting with Grails was how easy it was to have everything injected under the covers without needing to get into the weeds (in Grails case – Spring).  MVC Turbine offers this same functionality for the ASP.NET MVC programming.

Turbine is not exclusive to a particular IoC container.  Here is a feature list:

Features

  • Visual Studio 2008 Solution Templates for IoCs
    • Ninject
    • Castle Windsor
    • StructureMap
    • Unity
  • New runtime framework that allows extensibility
    • Blades (components) that are auto-registered and loaded at runtime.
    • Introduced the Core Blades to setup the basic runtime of an MVC application:
      • MvcBlade — wiring for MVC related components (Controllers, View Engines, etc).
      • WebBlade — wiring for System.Web components (IHttpModule, etc.).
      • RoutingBlade — wiring for the IRouteConfigurator implementation.
    • RotorContext that works with the Blades to setup the runtime.
  • Auto-registration of View Engines (VE)
  • Auto-registratrion of MVC Filters to support constructor injection.
    • Added new InjectableFilter attribute to associate a filter to an action.
    • Added support for IActionFilter, IAuthorizationFilter, IErrorFilter and IResultFilter
  • InferredViewResult handles inferred actions and reports HTTP 404 for missing actions.
  • Works with ASP.NET MVC in Mono

 

Service Orientation Requires Data Orientation

More and more the conversations are around SOA.  This one article at InfoQ stuck out to me regarding ‘service data’

Most of today’s SOA literature and implementations concentrate on defining business aligned services and rarely discuss the role and impact enterprise data has in the context of SOA

 

How to Uninstall – or make Message Stop loading up on Windows 7?

How to uninstall/remove Messenger on Windows 7 ?    My dad just got a new computer with Windows 7.  Anytime he starts it up, it wants him to sign in to Messenger.  He doesn’t use Messenger, and doesn’t want to use Messenger. 

What I find irritating is there isn’t any ‘don’t show this on startup’ or ‘turn this off’ within the Messenger pop-up.  At best you have to go out to the internet and start looking for hacks or ways to turn this off.

Microsoft – I don’t mind if you want to promote your own chat program in your OS, but please be kind enough to make it easy to turn off for non-computer expert users. 

Caliburn SL Nav Walkthrough/Intro

I’ve blogged in the past regarding ‘Caliburn’ by Rob Eisenberg.  Just a reminder:

Designed to aid in the development of WPF and Silverlight applications, Caliburn implements a variety of UI patterns for solving real-world problems. Patterns that are enabled by the framework include MVC, MVP, Presentation Model (MVVM), Commands and Application Controller.

Rob is in the process of ‘releasing various starter kits/samples for Caliburn’.  His first sample just recently released is :

Silverlight Navigation Walkthrough

Using jQuery to Scroll Just in Time for Paging Records..like Bing

Rob Conery blogs about using jQuery to scroll down a list of records with ‘just in time scrolling’ for paging.  Pretty cool – I have seen this feature used in different application.  I suspect this will become the defacto standard in paging lists.  Check out his how to here.

TFS Offline

Quote of the day… ‘Don’t work offline’.  I’ll keep the source of that quote unnamed, but I did think it was rather funny.  I hope TFS improves it’s offline capabilities.  This is very reminiscent of Visual SourceSafe – which I really didn’t like much.  SVN, Git, etc… all have pretty good offline capabilities.   While we are at it – I do hope TFS also integrates with explorer so if you edit a file outside of studio that it picks it up.  (Maybe you can, but I haven’t seen it).

UPDATE  I’ve been corrected that TFS does provide explorer integration with the  TFS power tools.

(My only response though… I was told this has been around since 2005… seems almost 5 years later this would be an installation option for TFS for Visual Studio ?  Guess you just have ‘know’ this is available – lol)

Google Docs

I am setting up my ‘Google’ realm of Wave, Gmail, Docs, Reader, etc… so far… I’m loving it.  Just recently I received an email with Excel spreadsheet.  Opened it up in Gmail, which prompted to use Google docs !  Worked out great.  And to share that document with my wife, I didn’t have to forward that document around.  Just share it exclusively to her.  All stored up securely on the Google cloud.

I did notice in the Excel to Google Doc conversion that lookups aren’t exactly the same, so it didn’t properly convert the lookup lists.  I hope they fix that.   I really see the world approaching of using this approach more and more.   With the cloud storage, feature rich word processor, spreadsheet and slide creation capability… who needs an expensive desktop copy of Office!

Steve’s Final ‘Thoughts of the Day’ – (or rather ‘Stirring the ORM Pot in the .NET world…’)

Douglass Starnes has a series on different data model approaches with asp.net mvc, showing how to setup them up and use them.

In part II of the series he makes this comment: 

In the ASP.NET MVC space I see three ORMs being used most commonly.  By far the favorite outside of Microsoft is NHibernate.  Inside of Microsoft there are two competing offerings: LINQ to SQL and Entity Framework.

This view/perspective – is it a correct one ?  Is Microsoft competing against NHibernate OSS .NET projects created by it’s own community ?  Or is Microsoft just giving more options ?  Microsoft doesn’t need to include NHibernate in any of it’s products – too many legal traps I’m sure.  What if it didn’t create it’s own ORM and merely demo’d features using NHibernate in it’s examples ?  I’m all for competition to make products better, but in this case, is MS having 2 ORM’s that are catching up in functionality, but still lagging behind NHibernate and other .NET ORM’s in the market a wise thing ?  Is that how you see it ?  I went to use EF in a project, but because it didn’t handle an ‘append only’ with ‘hilo’ id generation – and because it wasn’t poco based – where the entities are the domain objects – it was finally deemed impossible to use.  Meanwhile, we prototyped NHibernate and were able to implement everything needed in the Legacy system.  Personally, I want to pick the best of breed, not pick something just because of ‘who’ makes it.  

I don’t want to distract from his series, but that comment seems to be a prevailing one in the .net community.   What I wonder is ‘doesn’t Microsoft understand that is how it will be perceived’ – and if so… is their position to outdo the products, or do they consider this a core piece of the .NET framework to provide ORM solutions ?

I keep pointing to jQuery and ASP.NET MVC – they provide jQuery in the project templates for ASP.NET MVC.   How does that compare to including NHibernate support – or even just promoting it without including it ? 

Personally I can think of 3 examples of where they could make a difference:

1. Provide a Linq provider just like they did for EF and L2S (yes, there are Nhibernate linq providers in work – there is a basic one available now)

2. Provide a NHibernate DomainService out of the box for RIA.NET

3. Provide support for NHibernate out of the box for ADO.NET Data Services.

All three could be extensions that are referenced but included in each release.

Craftsmanship Dilemma:

Last thought… I was told to just ‘get something done’ basically… hack it.  No tests, no real design, just get it done now.  Do you think that is ok ?  How does that compare to craftsmanship ?  I don’t think I have to craft the perfect 100% solution, but how it gets built – ie. with a test, with some design/OO principles in place – shouldn’t we push back a bit to not just create ‘junk’ ?  I am noticing this trend in many industries.  Just ‘build the car’, doesn’t have to last, we need it cheap and now to compete.  At what point does quality matter ?  How would you feel if the rollercoaster your going to ride is built with that mentality?  Or the bridge ?  Or the airplane ?  Or how about the breaks on your car?  Why isn’t software engineers able to defend their craft in these situations ?  I guess it’s all about the $$$  ?  There is ‘agile’ … then there is ‘craftsmanship’…

 

Well, that is enough for the day – everyone have a great weekend!

ADO.NET Data Services

June 27th, 2009

I’m really impressed with what is happening around the ADO.NET Services (aka Astoria).

Think ‘RESTful’ url queries to entities in a way to abstracts out the particular underlying IQueryable provider.

This really does create a technology (as in Entity Framework vs. L2S vs. NHibernate.Linq) agnostic layer.

From the link above – a good set of video’s to watch (short and to the point):

How Do I …

More on Querying:  (how client queries relate back to the ADO.NET Services protocol RESTful queries)

ADO.NET Data Services – Querying with LINQ by Mike Taulty (and this link will show his other screencasts)

Further Reading:

Lost in Tangent has a series of Training blog posts

I do see ADO.NET Data Services as a great fit to behave as the service layer to your underlying domain entities model.

One thing that Mike Flasko demonstrates in the video (and Mike Taulty’s video) is the ability to query using several approaches…

I have two here:

      var entities = new BistroEntities(new Uri("http://localhost:56987/BistroWebDataServices.svc"));
      var query = from c in entities.Companies
                  where c.CompanyID.Equals(new Guid("56e0d889-5f54-4e2d-805b-9ba700e6b9e4"))
                  select c;
      var company = query.SingleOrDefault();
      company.Note = "Updated on " + DateTime.Now;
      entities.UpdateObject(company);
      entities.SaveChanges();

      DataServiceContext context = new BistroEntities(new Uri("http://localhost:56987/BistroWebDataServices.svc"));
      context.IgnoreMissingProperties = true;
      var q = context.Execute<Companies>(new Uri("/Companies", UriKind.Relative));
      var testCo = (from c in q
                    where c.CompanyID.Equals(new Guid("56e0d889-5f54-4e2d-805b-9ba700e6b9e4"))
                    select c).SingleOrDefault();
      testCo.Note = "Updated on " + DateTime.Now;
      context.UpdateObject(testCo);
      context.SaveChanges();
 

It is interesting to see the result of the ‘var’ query above:

{http://localhost:56987/BistroWebDataServices.svc/Companies(guid'56e0d889-5f54-4e2d-805b-9ba700e6b9e4')}
 

It is possible to drill down further, ie. to get all the contacts at a company assuming a 1 to many relationship:

{http://localhost:56987/BistroWebDataServices.svc/Companies(guid'56e0d889-5f54-4e2d-805b-9ba700e6b9e4')/Contacts}
 

You can make RESTful Uri queries, just as example of two:

http://localhost:56987/BistroWebDataServices.svc/Companies?$filter=startswith(Name,%20%27Test%27)
http://localhost:56987/BistroWebDataServices.svc/Companies?$orderby=Name
 

The first one queries the underlying Company entity object (which is mapped to the Companies table) and does a startswith query on the property of ‘Name’.

The second query does an orderby query by Company name.

Cool stuff  :)

(It’s no surprise that a decision was made by the RIA.NET Domain Services team to use ADO.NET DataServices as it’s underlying protocol).

For those with a close eye to detail, note the ‘unit of work’ with the ability to send the ‘UpdateObject’ – there is also the ability to send changes back with a batch update:

ie. 

entities.SaveChanges(SaveChangesOptions.Batch);
 

For an advanced topic, check out using ‘Modeling Data for Efficient Access at Scale’ w/Azure & ADO.NET DataServices – good video !

More on NCommon

June 4th, 2009

Once again, I’m going to talk about NCommon.  I want to share some of Ritesh Rao’s posts on concepts that NCommon incorporates.  I’m very impressed with his architecture and it helps that he provides NCommon for NHibernate, Linq2Sql, Entity Framework (and I see he is venturing into EF v2).

My last post touched on this, but I’ll review it again:

  1. Framework for implementing a Unit of Work Pattern
  2. Framework for implementing a Repository pattern that utilizes Linq
  3. Framework for implementing a Validations and Business Rules
  4. Implementation of the Specification pattern using Expressions
  5. Utility class to help store application specific data in the Thread Local Storage / Current Web Request and AppDomain Level Storage
  6. Guard class that mimics common guard statements that verify parameter values and throws exceptions if values are not acceptable.

NCommon uses the Apache License 2.0

NCommon uses the  Microsoft.Practices.ServiceLocation – this allows you to plug in your dependency inversion container of choice.  

I have gotten rid of the generic IoC wrapper implementation from the library as it doesn’t seem necessary anymore with the rally behind the Common Service Locator project.

This is shown in the accompany tests setup:

[SetUp]
        public void SetUp()
        {
            EFUnitOfWorkFactory.SetObjectContextProvider(() =>
            {
                var context = new TestModel();
                return context;
            });
            var locator = MockRepository.GenerateStub<IServiceLocator>();
            locator.Stub(x => x.GetInstance<IUnitOfWorkFactory>())
                   .Return(new EFUnitOfWorkFactory()).Repeat.Any();
            ServiceLocator.SetLocatorProvider(() => locator);
        }

NCommon sets the object context and implements the IUnitOfWorkFactory (the above shows with Entity Framework).

An example of how this is used can be found in the UnitOfWorkScopeTransaction class (UnitOfWorkScopeTransaction.cs- trunk/NCommon/src/Data)

ie. the ‘GetTransactionForScope’ method to retrieve the UnitOfWorkFactory:

 
var factory = ServiceLocator.Current.GetInstance<IUnitOfWorkFactory>();
var newTransaction = new UnitOfWorkScopeTransaction(factory, isolationLevel);
newTransaction.AttachScope(scope);
CurrentTransactions.Add(newTransaction);
return newTransaction;
 

The NCommon tests highlight the features of NCommon as well, including Fetching Strategies, Specification, Repositories, and Unit of Work.

Let’s look at some of Ritesh’s posts…

http://www.codeinsanity.com/2009/04/repository-pattern-thoughts.html

Some key items in this post to quote:

repositories should really represent a queryable data store that doesn’t abstract away queries behind methods that some unfortunate developer has to maintain and evolve, but rather allow consumers of the repository to query it directly. Hence why NCommon relies on repositories to implement the IQueryable interface to provide a query infrastructure directly on top of NCommon repositories.

I think this is an important piece to understand, and Ritesh follows up with the comment:

The approach I would take is rather than exposing the infrastructure requirements in the query object, I’d like it to take in an IQueryable and return back a IQueryable. This will allow chaining of queries by multiple of such Query objects without exposing any infrastructure concerns.

…

The problem with exposing ICriteria, or any other infrastructure component, to all layers of the application is that eventually a lot of infrastructure concern creeps into layers of the application where they don’t belong. I dislike the idea of having the expose ICriteria to the UI for adding paging and sorting on top of the query encapsulated by ICriteria.

That being said, in my opinion IQueryable is best suited for this job. Its a framework level member that is infrastructure agnostic, provides a very nice way to chain queries together and encapsulates our query requirements rather well.

» Read more: More on NCommon

JSING

February 5th, 2009

Quick bump for ‘JSING’, Linq to Objects for Javascript – http://www.codeplex.com/jsinq

Very cool, as a big fan of Linq, it’s cool to see someone building it for javascript.

(I haven’t used it yet, but I like the premise behind it)

What JSING can do…

  • Write arbitrarily complex queries against JavaScript arrays, DOM node lists or your own enumerable types
  • Find elements in the HTML DOM tree using SQL-like queries
  • Dynamically create HTML elements from JSON you have received via XMLHttpRequest in a declarative manner
  • Tinker with XML and turn it into something else
  • Combine it in interesting ways with the JavaScript-/Ajax-frameworks you are already using
  • Write less code by exploiting the power of declarative programming
  • And for the ambitious: write raytracers, monadic parser combinators, etc.

LINQ – Grouping Feature

August 3rd, 2008

I have a love affair… no, not that kind – the LINQ kind  :)    It makes what is normally ‘complex’ – into fun and rather easy to do.

Let’s take sorting.

ie. I have a list of many items from a database table that I retrieve.  Then I need to group all the ‘same types’ so I can do some reporting on them.

I run a fun aircraft ww2 flight sim website for flight simulator game ‘IL2: Sturmovik’.  I was asked recently to show the ‘kills to death’ ratio of the different aircraft flown by the pilots in this sim.

My database stores a list of these air summaries per mission – so you might have something like this:

KillerClass KilledClass

FW190       Spitfire

FW190       P47

P47           109

 

So the first step is to ‘group’ the Aircraft – do a ‘kill count’:

IEnumerable<IGrouping<string, MisAirSummary>> AirSummaryByKillerClass = airSummary.GroupBy(a => a.KillerClass);

(where airSummary is the results from my LINQ Query – a List<MisAirSummary>)

Simple!

So, how do I display the results?  (Note, in this sample I break some ‘Business layer’ vs. ‘UI Layer’ concepts… but that isn’t the topic is it…  ;) )

(I’m using ASP.NET MVC…)

I pass the two collections down to the view in the ViewData (normally I wouldn’t do it this way, but this is a quick and dirty sample)

note the ‘foreach (var items in AirSummaryByKillerClass.OrderBy(p => p.Key))’  line below.  Each ‘items’ is a

System.Linq.Lookup<string,FSData.MisAirSummary>.Grouping :

the AirSummaryByKillerClass is a :

{System.Linq.GroupedEnumerable<FSData.MisAirSummary,string,FSData.MisAirSummary>}

The ‘items.Key’ is the grouped by value, and has a list of the values.  Note is it using the ‘Lookup’ feature of Linq. 

 

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<%
    List<FSData.MisAirSummary> airSummary = ViewData["AirSummary"] as List<FSData.MisAirSummary>;
    IEnumerable<IGrouping<string, FSData.MisAirSummary>> AirSummaryByKillerClass = ViewData["AirSummaryByKillerClass"] as IEnumerable<IGrouping<string, FSData.MisAirSummary>>; %>
    

    <br /><br />
    <table id="stats" class="tablesorter" style="width:600px">
    <thead>
        <tr>
            <th>Type</th>
            <th>Kills</th>
            <th>Deaths</th>
            <th>K/D Ratio (x/1)</th>
        </tr>
    </thead>
    <tbody>
<% foreach (var items in AirSummaryByKillerClass.OrderBy(p => p.Key))
   { %>

            <tr>
            <td>
                <%
                    int kills = items.Count();
                    int deaths = airSummary.Where(s => s.KilledClass == items.Key).Count();
                    float kdRatio = 0.0F;
                    if (deaths != 0) { kdRatio = float.Parse(kills.ToString()) / float.Parse(deaths.ToString()); }
                %>
                <b><%= items.Key %> </b>

            </td>
            <td><%= kills.ToString() %></td>
            <td><%= deaths.ToString() %></td>
            <td><%= kdRatio.ToString("F")%></td>
            </tr>

<%} %></tbody> </table>
</asp:Content>
So there you have it - quite easy to implement!  (see it in action...) LINQ does the hard work for me, so I can just solve the problem at hand.

Shifting directions…

July 17th, 2008

Sometimes a refactor can be painful, but there is a light at the end of the tunnel, especially when you know the refactor will be a good move.

I really enjoyed working with Spring.NET but decided to shift to a simplier* model (Sharp Architecture).  A positive is that my code was separated well enough that the impact was minor.  (when I say ‘simplier’ – most that I’m only using a small subset of Spring.NET – NHibernate session management/Transactional management/Dao injection into my controllers)

One move led to another, and I made the jump to NHibernate 2.0.  While I was frustrated at being able to find the installer for NHQG 1.9 (there is one for 1.8 with NH 1.2) – I realized that the NHibernate direction is moving to NHibernate.Linq… so, hey, let’s try it out.

Let’s compare:

ICriteria:

            ICriteria crit = Session.CreateCriteria(typeof(EmployeeQuerySet))
                .Add(Expression.Like("LastName", lastName, MatchMode.Start));
            return crit.List<EmployeeQuerySet>();

 

NHQG:

return this.FindAll(Where.EmployeeQuerySet.LastName.Like(lastName, MatchMode.Start), OrderBy.EmployeeQuerySet.LastName.Asc);

 

NHibernate.Linq:

                        var query = from emp in Session.Linq<EmployeeQuerySet>()
                        where emp.LastName.StartsWith(lastName)
                        orderby emp.LastName ascending
                        select emp;

I personally like the Linq syntax because I’ve been using it since it was available to replace all my collection delegate calls.

So far so good on the refactoring…  :)

(By the way, I really haven’t seen the value of something like EF or Linq to SQL when I have the power of NHibernate and NHibernate.Linq)

Learn more about NH 2.0 here

Stepping into Silverlight…

June 21st, 2008

Well, I’ve decided it’s time to learn to use Silverlight.  I’m installing the Silverlight 2.0 and latest Blend software (along with Zoom) to run it.

This will be my first step into XAML/WPF.  If anyone has some good reading recommendations or tutorials worth going through, email me or post me some links here.

 

UPDATE: wow.  ok, I started in on some tutorials.  Silverlight/Blend/VS 2008 actually make a good combination.  I still don’t like that I can’t use Blend ‘inside’ VS 2008 – or that VS doesn’t just include this functionality (it’s silly to be popping back and forth between the two).  (Blend isn’t really needed, but it just makes it easier at times).

So, Silverlight isn’t really that difficult at all  :)   I’m having fun with it.  I did create a DeepZoom test, I have a map from a flight combat sim game and I wanted to try out the Deep Zoom composer – it basically takes an image and adds zooming scrolling capability to it.  Here is an example:

Kuban Zoom Test

Secondly, I create a sample after listening to this 15 minute video of a Silverlight/WCF/LINQ to SQL control that queries one of my database tables.  Not too shabby – it helps that they have included the Datagrid in Silverlight 2.0. 

The download of Silverlight is extremely small – I’m impressed they can stuff that much ‘.net framework’ into such a small download….  :)

 

UPDATE 2: Some very important tips to using LINQ to SQL with Silverlight (ie mostly for updates – since it’s disconnected with the WCF/WebServices)

1. unless you roll your own, you will have to add a timestamp column to your database tables… (yikes)

2. make sure you set that timestamp field to “Update Check” = “Always”

3. Use the following to ‘attach/refresh’

public void Update(Customer customer) { NorthwindDataContext context = new NorthwindDataContext(); context.Attach(customer); context.Refresh(RefreshMode.KeepCurrentValues, customer); context.SubmitChanges(); }

4. Lastly – and very important – click on the LINQ to SQL designer and set the ‘Serialization Mode’ to Unidirectional

Thought I’d share these pain points – all to get the disconnected, WCF, with Linq to Sql working with Silverlight  :)

Linq

February 17th, 2008

Some general links to the LINQ crowd:

1. LinqKit : “LINQKit is a free set of extensions for LINQ to SQL power users”

2. LINQ over NHibernate : Ayende has built a NHibernate Linq provider.

His project includes a comprehensive set of tests that run against Northwind database. A secondary benefit is he shows in his tests different linq queries as well :)

LINQ to SQL – using Linq for SQL ‘Like’ statement

January 26th, 2008

I’m really enjoying using LING to SQL, mostly because of the new .NET framework 3.5 LINQ features.

My latest find was ‘how do I make a ‘LIKE’ query using LINQ to SQL’ ?

Well, it was almost too intuitive :)

FSDALDataContext dc = new FSDALDataContext(connectionString);

            var pilotStats = from p in dc.CurrPilotStats
                             where p.PilotName.Contains(pilotName)
                             orderby p.Missions descending
                             select p;
            return pilotStats.ToList();
In the example above the equivalent SQL is
FROM tblCurrPilotStats WHERE (PilotName LIKE @ParamPilotName) ORDER BY Missions DESC"

If you are wanting a startswith or endswith, it’s the same syntax p.PilotName.Startswith(…)

A bit off subject, but I can approach queries with the syntax above, or use lamba:

FSDALDataContext dc = new FSDALDataContext(connectionString);
            var g = dc.MisAirSummaries.Where(air => air.MissionNum == decimal.Parse(missionID));
            return g.ToList();

Notice both statements have the ‘ToList()’ – the actual query is executed at that point.

Extension Methods

December 24th, 2007

In my last post I talked about using Lamba expressions. C# 3.0 includes extension methods.

 

List<Person> people = new List<Person>();
            people.Add(new Person("Steve"));
            people.Add(new Person("Jake"));
            people.Add(new Person("Tyler"));
            people.Add(new Person("Evan"));
            people.Add(new Person("Gina"));

int count = people.Count(person => person.FirstName.ToUpper().Contains("N"));
Assert.That(count, Is.EqualTo(2));

As you know, List<T> does not include by default a ‘Count’ method.

When we include a reference to System.Linq, it includes extensions that get added to any type of IEnumerable class.

Some more examples include:

  • Any – Returns true if any items meet the criteria.
  • Average – Returns an average of the field specified.
  • Count – Pretty straight forward (as shown above).
  • Where – Just like SQL, you can return a subset based on a condition.
  • OrderBy – Also just like SQL.

Let’s give some examples based on the list above:

bool any = people.Any(person => person.FirstName.Contains(“Steve”));

Assert.That(any, Is.True);

IOrderedEnumerable<Person> peopleSearch = people.Where(person => person.FirstName.Contains(“a”)).OrderBy(person => person.FirstName);

Using ‘where’ with ‘OrderBy’:

IOrderedEnumerable<Person> peopleSearch = people.Where(person => person.FirstName.Contains(“a”)).OrderBy(person => person.FirstName);

So, how do you create an Extension method?

Let’s create a simple example where you would want to validate the string email address, for example:

 

string email = "steve@steve.com";
email.IsValidEmailAddress();

As we know, string doesn’t contain a ‘IsValidEmailAddress()’, we can add this functionality by extending string using a static class/method:

ie.

 

 public static class ExtensionSample
{
    public static bool IsValidEmailAddress(this string s)
    {
        Regex regex = new Regex(@"^[w-.]+@([w-]+.)+[w-]{2,4}$");
        return regex.IsMatch(s);
    }
}

There is much more to this than I’ve shown here, but it should be a good start!