Linq to NHibernate

The popularity of NHibernate is steadily increasing. At the same time people get used to LINQ. Now there exists a LINQ to NHibernate provider since quite some time. It's not a complete implementation of a LINQ provider but it is still quite useful. Most of the day to day problems we face when developing typical business application can be solved by using this provider. And if there is a query that cannot be executed against the provider we still have the option to falling back to the hibernate query language (HQL).

In this post I'll give you an introduction on how you can use NHibernate in conjunction with LINQ. Let's start with the definition of a domain model we are going to use when querying the database by using LINQ expressions or LINQ query operators.

The domain model

I have the following simple domain model. A person can have a set of assigned tasks.

model

The entities

I want to keep the entities as simple as possible for this example. So their implementation is as follows

public class Person
{
    public Person()
    {
        Tasks = new List<Task>();
    }
 
    public virtual long Id { get; set; }
    public virtual string Lastname { get; set; }
    public virtual string Firstname { get; set; }
    public virtual IList<Task> Tasks { get; set; }
}
 
public class Task
{
    public virtual long Id { get; set; }
    public virtual string TaskName { get; set; }
    public virtual DateTime DueDate { get; set; }
}

one thing worth noting is the fact that I instantiate a new empty Tasks collection in the constructor of the Person class.

The mapping

For the mapping of my domain model I am going to use the Fluent NHibernate framework (please refer to my previous posts for a detailed introduction to this framework: part 1, part 2, part 3, part 4) .

The Task is very easy to map

public class TaskMap : ClassMap<Task>
{
    public TaskMap()
    {
        Id(x => x.Id);
        Map(x => x.TaskName);
        Map(x => x.DueDate);
    }
}

And the person is nothing more complicated

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Firstname);
        Map(x => x.Lastname);
        HasMany<Task>(x => x.Tasks)
            .LazyLoad()
            .Cascade.All();
    }
}

Just let's have a look at the mapping of the Tasks collection. I want the tasks to only be lazy loaded when loading a person entity (LazyLoad). And I want NHibernate to automatically save or update any tasks associated with a given person if ever the person is updated (Cascade.All).

Test the mapping

One quick test I want to always do is to check whether my mappings work as expected. Since I use Fluent NHibernate this is very easy and straight forward. A lot of infrastructure code is available to me to leverage and thus simplify my unit test regarding mapping of the domain entities.

The base test fixture

First I want to present my base class I use for all of my tests. Every test fixture used in this post will inherit from this base class.

public class FixtureBase<TModel> where TModel : PersistenceModel, new()
{
    protected SessionSource SessionSource { get; set; }
    protected ISession Session { get; private set; }
 
    [SetUp]
    public void SetupContext()
    {
        var cfg = new SQLiteConfiguration()
                        .InMemory()
                        .ShowSql();
        SessionSource = new SessionSource(cfg.ToProperties(), new TModel());
        Session = SessionSource.CreateSession();
        SessionSource.BuildSchema(Session);
        
        Context();
        Because();
 
        Session.Flush();
        Session.Clear();
    }
 
    [TearDown]
    public void TearDown()
    {
        TearDownContext();
 
        Session.Close();
        Session.Dispose();
    }
 
    protected virtual void Context()
    {
    }
 
    protected virtual void Because()
    {
    }
 
    protected virtual void TearDownContext()
    {
    }
}

First of all my base fixture has a generic parameter TModel. TModel represents the persistence model used during the tests. The persistence model must inherit from the PersistenceModel (provided by Fluent NHibernate) and it must have a default constructor.

In the SetupContext method (which is executed before each test)

  • I define my configuration I want to use. Most of the time I use the SQLite database in in-memory mode for my database related tests. Fluent NHibernate provides me such a configuration object. For debugging purposes I declare that I want to see the SQL statements generated by NHibernate (ShowSql).
  • Second I create a session source and pass the above configuration as well as an instance of the model used to the constructor of the session source.
  • Then I create a new session object. Note that since I am using SQLite in in-memory mode I have to use the same session object during the whole test (including setup and tear down) since the database schema (and the data) is destroyed when the session is closed.
  • I now use the Session object created above to generate the database schema. The schema is generated from the information provided by the model (which consists of all mappings)
  • Now I call the virtual Context and Because methods. The reason is that I want my unit test to be more BDD like
  • Finally I flush all pending operations from the session to the database and then clear the session.

The persistence model

The persistence model I am using is very straight forward. I just include all class mappings that are in the same assembly as the PersonMap.

public class TestModel : PersistenceModel
{
    public TestModel()
    {
        addMappingsFromAssembly(typeof(PersonMap).Assembly);
    }
}

I could also explicitly add mappings if I want so

public class TestModel : PersistenceModel
{
    public TestModel()
    {
        addMapping(new PersonMap());
        addMapping(new TaskMap());
    }
}

The test

Writing a test for the mapping is really straight forward with the aid of the PersistenceSpecification class provided by Fluent NH.

[Test]
public void can_add_person_without_tasks()
{
    new PersistenceSpecification<Person>(Session)
        .CheckProperty(x => x.Firstname, "Gabriel")
        .CheckProperty(x => x.Lastname, "Schenker")
        .VerifyTheMappings();
}

or a test which also tries to add tasks

[Test]
public void can_add_person_with_tasks()
{
    var tasks = new[]
                    {
                        new Task {TaskName = "Task 1", DueDate = DateTime.Today.AddDays(5)},
                        new Task {TaskName = "Task 2", DueDate = DateTime.Today.AddDays(6)},
                        new Task {TaskName = "Task 3", DueDate = DateTime.Today.AddDays(3)},
                    };
    new PersistenceSpecification<Person>(Session)
        .CheckProperty(x => x.Firstname, "Gabriel")
        .CheckProperty(x => x.Lastname, "Schenker")
        .CheckList(x=>x.Tasks, tasks)
        .VerifyTheMappings();
}

Do I need to tell that the tests pass successfully? It's really that easy... I have not needed a single line of XML so far. And no "magic strings" are involved. For me it's really a joy to work like this.

And now finally we get LINQ into the play

The context

In LINQ the notion of a context is very important. It represent kind of a facade to the database. LINQ to NHibernate provides us a base class from which we can derive when we define our own context. In our simplified model we have only 2 entities and thus our context needs just two members to have access via LINQ to either the persons or tasks.

public class SampleContext : NHibernateContext
{
    public SampleContext(ISession session)
        : base(session)
    { }
 
    public IOrderedQueryable<Person> Persons
    {
        get { return Session.Linq<Person>(); }
    }
 
    public IOrderedQueryable<Task> Tasks
    {
        get { return Session.Linq<Task>(); }
    }
}

Testing

Now I want to implement a first test to check whether LINQ to NHibernate does indeed work as expected. First I have to setup a context where I have some person object with tasks in the database

public class a_repository_with_persons_having_tasks : Person_Fixture
{
    protected Person[] persons;
    private IList<Task> tasks1, tasks2, tasks3;
 
    protected override void Context()
    {
        base.Context();
        tasks1 = new[]
                     {
                         new Task {TaskName = "Task 1.1", DueDate = DateTime.Today.AddDays(5)},
                         new Task {TaskName = "Task 1.2", DueDate = DateTime.Today.AddDays(6)},
                         new Task {TaskName = "Task 1.3", DueDate = DateTime.Today.AddDays(3)},
                     };
        tasks2 = new[]
                     {
                         new Task {TaskName = "Task 2.1", DueDate = DateTime.Today.AddDays(5)},
                         new Task {TaskName = "Task 2.2", DueDate = DateTime.Today.AddDays(6)},
                         new Task {TaskName = "Task 2.3", DueDate = DateTime.Today.AddDays(3)},
                     };
        tasks3 = new[]
                     {
                         new Task {TaskName = "Task 3.1", DueDate = DateTime.Today.AddDays(5)},
                         new Task {TaskName = "Task 3.2", DueDate = DateTime.Today.AddDays(6)},
                         new Task {TaskName = "Task 3.3", DueDate = DateTime.Today.AddDays(2)},
                     };
        persons = new[]
                      {
                          new Person {Firstname = "Gabriel", Lastname = "Schenker", Tasks = tasks1},
                          new Person {Firstname = "John", Lastname = "Doe", Tasks = tasks2},
                          new Person {Firstname = "Ann", Lastname = "Moe", Tasks = tasks3},
                      };
        foreach (var person in persons)
            Session.Save(person);
    }
}

Now I can write a test for the case where I want to retrieve all persons from the database

[TestFixture]
public class when_querying_all_persons : a_repository_with_persons_having_tasks
{
    private IEnumerable<Person> list;
 
    protected override void Because()
    {
        list = from p in db.Persons
               select p;
    }
 
    [Test]
    public void should_return_all_persons()
    {
        list.Count().ShouldEqual(persons.Length);
    }
}

The query generated by the above test is

SELECT  this_.Id as Id0_0_, 
        this_.Lastname as Lastname0_0_, 
        this_.Firstname as Firstname0_0_ 
FROM [Person] this_

That's exactly what we were expecting!

Using Where to get a filtered list

Now let's do some more interesting stuff. I want to have a filtered list of persons

[TestFixture]
public class when_retrieving_filtered_list_of_persons : a_repository_with_persons_having_tasks
{
    [Test]
    public void can_filter_by_LastName()
    {
        var list = db.Persons.Where(x=>x.Lastname=="Doe");
        list.Count().ShouldEqual(1);
    }
 
    [Test]
    public void can_filter_by_task()
    {
        var list = from p in db.Persons
                   from t in p.Tasks
                   where t.DueDate == DateTime.Today.AddDays(3)
                   select p;
        list.Count().ShouldEqual(2);
    }
}

In the first test I use the Where extension method defined by LINQ to filter my collection of persons. The extension methods defined by LINQ are also called query operators. The select statement generated by Linq2NH is

SELECT count(*) as y0_ 
FROM [Person] this_ 
WHERE this_.Lastname = @p0; 
@p0 = 'Doe'

In the second test I use the new language extension introduced for C# (also called a query expression) to get a filtered set of persons. This time we get the following select statement sent to the database

SELECT          count(*) as y0_ 
FROM            [Person] this_ 
left outer join [Task] t1_ on this_.Id=t1_.Person_id 
WHERE t1_.DueDate = @p0; 
@p0 = '29.11.2008 00:00:00'

Obviously also joins between tables work as expected.

Getting ordered lists

Often we need an ordered list of items, in this case persons ordered by their last name.

[Test]
public void can_order_by_LastName()
{
    var list = db.Persons.OrderBy(x => x.Lastname);
    list.First().Lastname.ShouldEqual("Doe");
}

The query generated is

SELECT  this_.Id as Id0_0_, 
        this_.Lastname as Lastname0_0_, 
        this_.Firstname as Firstname0_0_ 
FROM [Person] this_ 
ORDER BY this_.Lastname asc

Code

The code accompanying this post can be found here.

Summary

It is straight forward to use LINQ to NHibernate. Although the Linq2NH provider is not fully implemented it is more than sufficient for most scenarios we encounter in typical projects. And if ever we encounter a query that cannot be executed through the Linq2NH provider we can still implement the query by using HQL instead.

GabrielEnjoy

 Blog Signature Gabriel

Print | posted on Wednesday, November 26, 2008 5:13 AM

Comments on this post

# re: Linq to NHibernate

Requesting Gravatar...
Very cool article.
I have a couple of questions:
What are the limitations of LinqToNH as today?
What is pending to be done?
Is there a milestone to reach for this project?
Where can I download the required assemblies to start to play with it?
Best regards.
Left by Jaime Febres on Nov 27, 2008 4:44 AM

# re: Linq to NHibernate

Requesting Gravatar...
@Jaime:
- Linq2NH has the same limitations as the criteria api of NH.
- There is a plan to totally re-implement the provider and provide a AST (abstract syntax tree) based implementation. Currently Ayende is raising funds for this project. If you are interested in supporting this project please contact Ayende.
- Linq2NH is a project of the NH contributions (but to start with - it is included in the binaries of Fluent NHibernate)
Left by Gabriel N. Schenker on Nov 27, 2008 10:47 PM

# re: Linq to NHibernate

Requesting Gravatar...
Jaime: I've heard that there are 2 implementation of LINQ 2 NH.

But (can't remember where I read it) they said both are already avaiable, so with your mentioned plan to release Linq2NH with AST implementation I would count 3 of them already ;)

I am lost.

And why is it such a problem to have LINQ provider working (I know it isn't breeze but it isn't nuclear science as well) when most of the OR/M tools already have it working nicely, from LLBLGen to Lightspeed to (partialy) working Subsonic 3.0, and some of those projects aren't enterprise oriented as NHibernate is.

It is surely lacking behind, Oren allways tried to keep NHibernate somewhat _hacker_ tool and it still don't have a LINQ provider.
Left by nefajciar on Dec 04, 2008 4:06 AM

# re: Linq to NHibernate

Requesting Gravatar...
@nefajciar: It *IS* hard to implement a LINQ provider which covers 100% of the possible queries. It was not that hard to implement one that "only" covered the most important part (and not all edge cases). This one is available since quite some time now as one of the NHibernate contribution projects. This one is also the ONLY "official" implementation so far.
Left by Gabriel N. Schenker on Dec 07, 2008 6:39 PM

# re: Linq to NHibernate

Requesting Gravatar...
All of it seems very nice, but I have to ask if you know how well-tested it is? Is it something to put in production code and do you know if the join-method is implemented?
Left by Mats Nilsson on Dec 20, 2008 6:24 AM

# re: Linq to NHibernate

Requesting Gravatar...
@Mats: NH2Linq is covered by a large number of unit tests. They represent the typical scenarios one encounters when querying. Most of the tests pass. But some (rather specific) features are not yet supported and thus the respective tests fail.
And yes, you can definitely use it for production code! A lot of people do.
Left by Gabriel N. Schenker on Dec 22, 2008 6:38 PM

# re: Linq to NHibernate

Requesting Gravatar...
Hi Gabriel

I found that the test "can_filter_by_task()" is not working as expected.

If you see thro' VS IDE, watch window shows following error :
could not instantiate: <>f__AnonymousType0`2[[Linq2NH.Person, Linq2NH, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Linq2NH.Task, Linq2NH, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Watch is added on following statement -
var list = from p in db.Persons
from t in p.Tasks
where t.DueDate == DateTime.Today.AddDays(3)
select p;

Is such statement is supported by NHibernate.LINQ ??

[Please not that, to debug it in VS2008, I changed reference of Nunit to VS's test tool namespace and updated attrib for same.


Regards
Rajesh

Left by Rajesh on Mar 06, 2009 3:30 AM

# re: Linq to NHibernate

Requesting Gravatar...
After the following modification test stopped working:
[Test]
public void can_filter_by_task_with_list()
{
var list = from p in db.Persons
from t in p.Tasks
where t.DueDate == DateTime.Today.AddDays(3)
select p;

list.ToList().Count().ShouldEqual(1);
}

NHibernate: SELECT this_.Id as Id1_1_, this_.Lastname as Lastname1_1_, this_.Firstname as Firstname1_1_, t1_.Person_id as Person4_3_, t1_.Id as Id3_, t1_.Id as Id0_0_, t1_.DueDate as DueDate0_0_, t1_.TaskName as TaskName0_0_ FROM [Person] this_ left outer join [Task] t1_ on this_.Id=t1_.Person_id WHERE t1_.DueDate = @p0; @p0 = '4/19/2009 12:00:00 AM'

failed: NHibernate.QueryException : could not instantiate: <>f__AnonymousType0`2[[Linq2NH.Person, Linq2NH, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Linq2NH.Task, Linq2NH, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
----> System.InvalidCastException : Object must implement IConvertible.

Is it one of the limitations you talked about?
Left by Andrey T. on Apr 15, 2009 4:26 PM

# re: Linq to NHibernate

Requesting Gravatar...
"Note that since I am using SQLite in in-memory mode I have to use the same session object during the whole test (including setup and tear down) since the database schema (and the data) is destroyed when the session is closed."

Thanks this just saved me a big headache.. :)
Left by Jake Scott on Jun 30, 2009 9:31 PM

# re: Linq to NHibernate

Requesting Gravatar...
Doesn't even work.

WHY can't you NH people EVER post a single working line of code?

Instead of blathering on uselessly, POST A WORKING SAMPLE WITH EVERYTHING PEOPLE NEED TO SEE for ONCE in your life.
Left by Doesn't even work on Sep 13, 2009 7:16 AM

# re: Linq to NHibernate

Requesting Gravatar...
Thanks for all the great posts. You write about difficult subjects in such a clear manner that even I can understand them!!
Left by Multivariate Testing on Nov 07, 2009 12:23 PM

# re: Linq to NHibernate

Requesting Gravatar...


It’s a debatable readability improvement, but you can treat each where condition separately, rather than ANDing them together. It’s sometimes more readable, and definitely makes it easier to add and remove lines in the future:

where call.StartTime > beginDate
where (call.EndTime == null || call.EndTime < DateTime.Now) // Reordered to put the null check in front, just in case the query is ever run against in-memory data
where call.Interpreter.Id == interpreterId
Left by Call Center Software on Nov 07, 2009 12:38 PM

# re: Linq to NHibernate

Requesting Gravatar...
Leaving the readability aspect aside, the linq query is strongly typed, while the criteria one isn’t. That’s also a big difference.
Left by International Medical Insurance on Nov 07, 2009 12:54 PM

# re: Linq to NHibernate

Requesting Gravatar...
I know that many advanced programmers strongly believe in layering their code, but isn't this getting a bit ridiculous? I mean, adding yet another layer between your business logic/model and your database. Putting NHibernate or LINQ in between the model and DB makes sense (because the simplify the coding when used right), but putting both of them in between just adds unnecessary complexity, doesn't it?
Left by Electric Tea Kettle on Nov 08, 2009 1:12 AM

# re: Linq to NHibernate

Requesting Gravatar...
Putting NHibernate or LINQ in between the model and DB makes sense (because the simplify the coding when used right), but putting both of them in between just adds unnecessary complexity, doesn't it?
Left by Orkut Greetings on Nov 16, 2009 10:46 AM

# re: Linq to NHibernate

Requesting Gravatar...
It is recommended article on Linq to Hibernate, but I think NHibernate is much better than it. Thanks for sharing the code.
Left by Prada Eyeglasses on Nov 20, 2009 10:44 AM

# re: Linq to NHibernate

Requesting Gravatar...
Language Integrated Query is an advanced concept introduced in .Net 3.5.Using this you can write your database query in .Net Environment itself.You can read and update the database very effectively using Linq.
Left by SEO on Dec 03, 2009 6:34 PM

# re: Linq to NHibernate

Requesting Gravatar...
I am using SQLite in in-memory mode I have to use the same session object during the whole test (including setup and tear down) since the database schema (and the data) is destroyed when the session is closed."
Left by como aprender a jugar poker on Dec 03, 2009 8:25 PM

# re: Linq to NHibernate

Requesting Gravatar...
The post is very nicely written about NHibernate.I always love to read this kind of stuff.Thanks for sharing this post.
Left by Edmonton Web Design on Dec 07, 2009 7:05 AM

# finding cell number

Requesting Gravatar...
You write about difficult subjects in such a clear manner that even I can understand them!!
Left by finding cell number on Dec 07, 2009 5:50 PM

# re: Linq to NHibernate

Requesting Gravatar...
NHibernate is indeed a very good application. Codes and the domain model are very helpful. Thanks for sharing.
Left by Limousine NY on Dec 08, 2009 3:44 PM

# re: Linq to NHibernate

Requesting Gravatar...
Before diving into the code it is essential to define what LINQ actually is. LINQ is not C# 3.0, and vice versa. LINQ relies heavily on the new language enhancements introduced in C# 3.0;
Left by flooring on Dec 11, 2009 4:57 PM

# re: Linq to NHibernate

Requesting Gravatar...
Great code that will come in use soon for my new project. Thanks
Left by shock collars for dogs on Dec 20, 2009 8:39 AM

# re: Linq to NHibernate

Requesting Gravatar...
this si great psot! thanks
Left by cable glossary on Dec 21, 2009 7:00 PM

# re: Linq to NHibernate

Requesting Gravatar...
Is such statement is supported by NHibernate.LINQ ??

[Please not that, to debug it in VS2008, I changed reference of Nunit to VS's test tool namespace and updated attrib for same.
Left by pandora jewelry on Dec 24, 2009 11:48 PM

# re: Linq to NHibernate

Requesting Gravatar...
I had a great time reading around your post as I read it extensively. Excellent writing! I am looking forward to hearing more from you.
Left by Internet Kasino Test on Dec 25, 2009 9:31 PM

# re: Linq to NHibernate

Requesting Gravatar...
I must say, greatest article tips!
Left by Purchase essay on Dec 30, 2009 8:02 AM

# re: Linq to NHibernate

Requesting Gravatar...
I agree with author, anyways great articlei ndeed, I really like the idea of the writer, keep up the good work, cheersThanks for this
information.
Left by airport bus New York on Jan 14, 2010 3:24 PM

# re: Linq to NHibernate

Requesting Gravatar...
Putting NHibernate or LINQ in between the model and DB makes sense (because the simplify the coding when used right), but putting both of them in between just adds unnecessary complexity, doesn't it?
Left by web design nyc on Jan 14, 2010 7:54 PM

# re: Linq to NHibernate

Requesting Gravatar...
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful.
Left by Caviar on Jan 15, 2010 2:47 PM

# re: Linq to NHibernate

Requesting Gravatar...
I am happy to find this post very useful for me, as it contains lot of information. I always prefer to read the quality content and this thing I found in you post. Thanks for sharinging
Left by Movers Bronx on Jan 15, 2010 5:45 PM

# re: Linq to NHibernate

Requesting Gravatar...
oh ok i agree
Left by make money online on Jan 16, 2010 1:20 PM

# re: Linq to NHibernate

Requesting Gravatar...
I will immediately grab your rss feed to stay privy of any updates. Pleasant work and much success in your business dealings!
Left by healthy weight loss pills on Jan 17, 2010 9:09 AM

# re: Linq to NHibernate

Requesting Gravatar...
The is the first model ive seen for linking the two. I will try the code.
Left by fellowes powershred on Jan 18, 2010 8:38 AM

# re: Linq to NHibernate

Requesting Gravatar...

Lot of thanks for this article. Its really a very good topic. Its so interesting and attractive. I like it so much.

Thanks.
Left by Brochure Printing on Jan 27, 2010 4:49 PM

# re: Linq to NHibernate

Requesting Gravatar...
What's more, a bracelet can also be equipped with different small pandora jewelry and even you can change it according to your mood at any time. Here are some meanings of pendant. Small Plane stands for traveling and adventure ; anchor, stability and hope; your baby's boots, having a lot of babies; small feeding pandora bracelets abundant food; Church means happiness and stability of marriage; dragonfly means riches; Eiffel Tower means travel and exploration; four-leaf clover means fortune; horseshoe means luck; Nest means a happy family; bride shows a happy bride in her coming pandora jewelleryship steering shows pandora beadscalming and confidence; pandora ukcoin shows rich marriage life. Wish bone, dreams being about to come true; pandora charm bracelets, love; one heart shot by an arrow, romantic love; purse, wealth; and heart-shaped lock, true love.
Left by kasandra1972 on Jan 29, 2010 12:51 PM

# re: Linq to NHibernate

Requesting Gravatar...
hi Lot of thanks for this article. Its really a very good topic. Its so interesting and attractive. I like it so much.

Thanks.
Left by Medical Spa New York on Feb 10, 2010 4:31 PM

# re: Linq to NHibernate

Requesting Gravatar...
Thanks for such a great post and the review, I am totally impressed! Keep stuff like
this coming.
Left by kanchan on Feb 10, 2010 11:34 PM

# re: Linq to NHibernate

Requesting Gravatar...
great stuff... enjoyed reading it...
4Inkjets Review
Buying Ink Cartridges Online
Left by 4Inkjets Review on Feb 18, 2010 2:16 AM

# re: Linq to NHibernate

Requesting Gravatar...
NHibernate seems to be a steadily growing technology that pros like you know so well. Informative article once again.
Left by LASIK Facts on Feb 19, 2010 4:41 AM

# forex trading

Requesting Gravatar...
very informative post. Thanks for sharing the wonderful post. It will help me a lot.
Left by forex on Feb 19, 2010 10:49 AM

# re: Manage SQL Databases

Requesting Gravatar...
Very cheap, very seductive, to echocardiography. Strongly recommended! ! !
panora jewelry
panora jewelry
panora jewelry
panora jewelry
Left by pandora jewelry pzm on Feb 21, 2010 2:47 PM

# RE

Requesting Gravatar...
thats a really new detailed explaination just like the Probiotics Benefits explaination
Left by Probiotics Benefits on Feb 21, 2010 9:17 PM

# re: Linq to NHibernate

Requesting Gravatar...
That is an absolutely fantastic explanation of linq to nhibernate. Thank you.
Left by registry cleaner reviews on Feb 21, 2010 11:01 PM

# re: Linq to NHibernate

Requesting Gravatar...
Great. Thanks!

rain barrel Regards. compost tumbler
Left by tomw on Feb 22, 2010 6:38 AM

# re: Linq to NHibernate

Left by custom essay writing on Feb 22, 2010 9:44 PM

# re: Linq to NHibernate

Requesting Gravatar...
Lots of great information here as well as useful code. I also appreciated the follow up comments reminding of the differences from LINQ and C# 3.0.


CSC
Left by Costomes on Feb 23, 2010 2:57 PM

# Daoc Plat

Requesting Gravatar...
Do you knowDaoc Plat?if you play the online game,you will knowDaoc Platinumis the game gold.In the game,if you had moreDaoc Gold,you will had a tall level.But if you wantDark Age of Camelot Palt,you can come here and spend a little money to boughtDark Age of Camelot Gold.Quickly come here.
Left by Daoc Plat on Feb 24, 2010 1:20 PM

# discount ed hardy women long sleeve shirts sales online

Requesting Gravatar...
YS0225A5 If you think you beaten, you are! If you think you dare noted hardy clothing, you don't! If you want to win but think you can't, It's almost a cinch you won't ed hardy hoodies! If you think you'll lose,you're lost! For out of the world we find.Success begins with a fellow's will,It's all in a ed hardy shirts state of mind! Life's battles don't always go.To the stronger and faster ed hardy coats man,But sooner or later the man who wins,Is the man who thinks he can! When You Belive http://www.edfashionclothes.com/,Many night we've prayed!With no proof anyone could hear!In our heart a hopeful moncler online store song,we barely understood!Now we are not afraid !Although we know there's much to fear!We were moving the moncler jackets mountian long,Before we knew we could!There can be miracles!
Left by discount mens moncler down coat on Feb 24, 2010 9:54 PM

# discount Ugg Broome Boots in chestnut leather online sales

Requesting Gravatar...
YS0225A8 Before there was no eason in the world,As now there is!The moncler jackets course of water was my only course,My repetitions oceans' sough and swell ugg adirondack boots!My seasons pleasurable,Before there was no reason in the world,As now there is ugg broome boots!To measure time from sleep I rose to sleep,To measure space I pastured on surprise http://www.edhardy-buy.com/,O meadows of resemblances,I was the grove on whose mosaic floors,The moncler online seeds of otherwise were spent,My gods had many arms,I was the Caesar of unmarshaled grass ugg boots!Faustus in the branches,My first ambitions were my sorrows long!Before there was no reason in the world,As now there is!
Left by discount womens moncler jacket on Feb 24, 2010 10:33 PM

# discount air jordan shoes 23 sales online

Requesting Gravatar...
YS0225A7 whethe sun hugs the moon, the sky clses her eyes.when the sun hug the moon the sea quiet her jordans shoes.when the sun hugs the moon,the forest stops her susurrus.when the sun hugs the nike sb dunk high,the desert hodlds her breathe.Thousands of years's waiting is only for this nike acg shoes moment.Never be disappointed.Never give up.It hax been sucha long time.At nike air max 2003 this momentmeet each other in course of time.Do not cry,Moon.I guard you forever.Cause you are in my life,everyting has its meaning.The fascinating Diamond Ring,is the ring i give you,May it give you warm http://www.nikejordanshoes2sell.com/ threduce your tears.Do not cry,Sun,I will be there with you forever/Meeting you has given me precious memeory.The resplendent Baily Beads.is the gem i give you .May i give you cheap air jordan 22 shoes strength, shine in your morning.Meet soon and part soon.It makes peop;e retrospect in spite of lasting a few minutes.A long times waiting is coming.Don't know when the next meeting is .When the sun hugs the Moon. the Moon hugs the sun as well Hugging tightly,regian the lost nicety.
Left by discount nike air max shoes sale on Feb 24, 2010 10:39 PM

# discount air jordan shoes 25 sales online

Requesting Gravatar...
YS0225A6 When you belive,Though hope is frail.It's hard to kill,Who knows what cheap prada shoes miracles,You can achieve,When you belive! Somehow you will,

You will when you belive new nike air max!And in this time of fear, When prayer so oten proves in vain, Hope seems like the http://www.nikeaf1jordanshoes.com/summer birds. Too swiftly flown away, And now I am standing wholesale gucci shoes here.My heart's so full I can't explain.Seeking faith and speaking women's nike shox words I never thought I'd say, They don't always happen when you ask authentic air jordan shoes.And it's easy to give in to your fear. But when you're blinded by your pain!
Left by discount mens moncler down coat on Feb 24, 2010 10:41 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heat has been broken,Hear the words,I'm here, my child,;And know your christian louboutin uk angel has spoken.For even in the darkest hour,When all of discount louboutin shoes hope seems gone,They'll give you strength to live your life,And desire to go on.And if your faith in Heaven, Should ever fade away,They'll help renew your christian louboutin boots spirit, And help you find your way.Even though you're ever filled with doubt, About the christian louboutin pumps life you live,Know that they are there to give you All that they can give.For you see, the Father sent them,Because to Him, you mean so much,That He sent them just for you,my louboutin sale friend,And your life, they will touch.They will always be here,They will never leave your http://www.christianlouboutinshoestore.com/ side;And upon their strength and guidance,You always may rely.Take comfort in their guidance, Draw strength from up above,And know that their sweet presence,Is God's precious gift of love.
Left by cheap christian louboutin shoes on Feb 25, 2010 2:58 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 If I were a boy again, Iwould practice perseverance more often, and never give up a thing because it was ugg australia boots or inconvenient. If we want light, we must conquer darkness. Perseverance can sometimes equal genius cheap ugg boots in its results. “There are only two creatures,” syas a proverb, “who can surmount the pyramids—the eagle and the snail.” If I were a uggs sale boy again, I would school myself into a habit of http://www.topsnowboots.com/ attention; I would let nothing come between me and the subject in hand. I would remember that a good skater never tries to skate in two ugg cardy boots directions at once. The habit of attention becomes part of our life, if we begain early enough. I often hear cheap gucci shoes grown up people say “ I could not fix my attention on the sermon or ugg coquette book, although I wished to do so” , and the reason is, the habit was not formed in youth.
Left by cheap ugg upside boots 5163 on Feb 25, 2010 3:02 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hold fast to dream.For if dreams die. Life is a broken-winged bird,That ugg australia boots can never fly.Hold fast to dreams. For when dreams go,Life is a barren ugg tall boots field, Frozen only with snow !You never know until you try; And you never try unless you really try ugg cardy boot. You give it your best shot; You do the best you can. And if you have done everything http://www.uggsnowbootsbest.com/! In your power,and still,The truth of the uggs argyle knit matter is! That you haven\'t failed at all.When you reach for your dreams,No matter what ugg boots they may be,You grow from the reaching;You learn from the trying;You win from the doing.
Left by cheap ugg classic cardy boots on Feb 25, 2010 3:06 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 A true friend s someone who reaches for your hand and touches your cheap hockey jerseys heart.There's always going to be people that hurt you,so what you have to do is keep on trusting nfl jerseys and just be more careful about who sport jerseys you trust next time around.Make youself a better person and know who you are discount nba jerseys before you try and know someone else and expect them to know you mlb jerseys on sale.Remember:Whatever happens,happens for a reason.How many people actually have 8 true http://www.nfljerseymlb.com/friends Hardly anyone I know.But some of us have all right friends and good friends.
Left by cheap adiads nba jerseys sale on Feb 25, 2010 3:10 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unwearied stl, lover by lover,They paddle in the cold,Companionable ugg australia shoes streams or climb the air;Their hearts have not grown old;ugg coquette Passion or conquest, wander where they will, Attend upon them still ugg adirondack boots. But now they drift on the still water, Mysterious, beautiful; Among what http://www.uggboots4buy.com/ rushes will they build, By what lake’s edge or pool,Delight men’s mbt shoes eyes when I awake some day.To find they have flown uggs classic cardy away?Before there was no reason in the world As now there is I was the bough bent easy by a ugg boots bird I was the vague blue-grazing flock The sleeping and invisible!
Left by cheap women's ugg elsey boots on Feb 25, 2010 3:13 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 When you are old and gay and full of sleep,And nodding by the moncler jackets fire, take down this book! And slowly read jordans sheoes , and dream of the soft look,Your eyes had once, and of their cheap nike shoes shadows deep;How many loved your moments of glad grace,And loved your beauty with nike air force 1 love false or true; But one man loved the pilgrim soul in you,And http://www.onestop-onlineshopping.com/ loved the sorrows of your changing face; And bending down beside the designer clothing glowing bars,Murmur, a little sadly, how love fled.And paced upon the mountains overhead discount air jordan shoes,And hid his face amid a crowd of stars.
Left by cheap nike air max 90 online on Feb 25, 2010 3:24 PM

# discount louis vuitton damier canvas handbags online sales

Requesting Gravatar...
YS0226A11 Surrounding you ae angels,They are there to guide your path.If designer purses weaesskn overcomes you,They'll give you strength if you will ask. They are your protection.When discount designer bags on sale life seems too hard to bear,And though you feel alone at times, The louis vuitton 2009 angels ... they are there.Their faces may be hidden And their voices you might not hear,But they are ALWAYS with you,Through your laughter or your tears.http://www.handbags4buy.com/ They'll walk along beside you,They'll guide your leather handbags steps along the way, They'll comfort you and hold you,Protect you dior handbags night and day.They'll hold to your hand tightly ,They'll not ever let it go,And they'll gently lead you cheap designer handbagsforward,Taking each step very slow.For even as you slumber,They watch closely over you;They are there beside you. In each and every thing you do.
Left by cheap nike air max 90 online on Feb 25, 2010 3:27 PM

# re: Linq to NHibernate

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop
as
Left by sbb on Feb 27, 2010 10:06 PM

# re: Linq to NHibernate

Requesting Gravatar...

wedding dresses,wedding gowns,bride dresses,bridesmaids dresses,evening dresses,bridal gowns,flower girl dresses
Wedding Gowns
Formal Gowns
Cocktail Gowns
Find the wedding dress designer and wedding dress that's right for you! Browse dresses from
Bridesmaid Gowns
Evening Gowns
View our selection of exquisite, handmade gowns and dresses for your wedding
Wedding Dresses, Wedding Shoes and Wedding Accessories from wedding shop, the UK's finest collection of designer wedding dresses.
Use the wedding dress and
cheap wedding
wedding dresses
wedding shop


q
Left by sbb on Mar 02, 2010 7:59 PM

# re: Linq to NHibernate

Requesting Gravatar...
I am always searching online for articles that can help me. Thank you
Powerpoint Converter
rd
Left by powerpoint on Mar 05, 2010 9:52 PM

# re: Linq to NHibernate

Requesting Gravatar...
thanks for sharing.
Left by ucvhost on Mar 06, 2010 2:19 AM

# ugg boots

Requesting Gravatar...


they are very good and useful!!!
ugg outlet
cheap uggs
nike shoes
wholesale watches 5862
Left by ugg boots on Mar 07, 2010 5:42 PM

# re: Linq to NHibernate

Requesting Gravatar...
It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info! Youtube to MP4 Converter
Convert PDF to image
.
Left by powerpoint on Mar 08, 2010 2:12 PM

# re: Linq to NHibernate

Left by nowGoogle.com adalah Multiple Se on Mar 09, 2010 9:33 PM

# re: Linq to NHibernate

Requesting Gravatar...
Best Windows VPS Hosting by ucvhost
If you choosing for the best windows vps | cheap vps | windows hosting | Cheap Hosting | Forex Vps hosting service, you need to hunt for those virtual private servers that can run as isolated processes while being part of a Web Server, and provide you complete privacy and root access as the VPS owner. You should also ask for CPU resources, guaranteed bandwidth, memory, and disk space, to make the most of your chosen Windows VPS hosting service. Thanks ucvhost
THANKS
Left by ucvhost on Mar 10, 2010 1:54 AM

# re: Linq to NHibernate

Requesting Gravatar...
Cheap A&F Made Me Fashionable too
abercrombieOuterwear
abercrombie and fitchabercrombie henleys crew
abercrombie & fitchhollister uk
abercrombie saleabercrombie womens
abercrombie fitchabercrombie mens
A&F
Left by qq on Mar 10, 2010 12:37 PM

# re: Linq to NHibernate

Requesting Gravatar...
Firstly I will talk about UGG boots' Origin. cheap ugg boots has been created in Australia during the First World War, by the Australian pilot, who wrapped in sheep's clothing with two feet into the shoes to protect from the cold weather. Then it gradually became popular in Australia. Initially the name came in, called ugg boots sale which means ugly shoes. Later, Australians nicknamed it ugg boots deutschland. Until 1994, an American registered the yiqie you chongyan trademark of UGG Australia, and began to produce UGG boots in a large scale. Today, ugg Australia is a very popular brand in the world.
Left by cheap ugg on Mar 10, 2010 6:31 PM

# re: Linq to NHibernate

Requesting Gravatar...
It is very nice of you.
free ads |job search|latex mattress
Left by jessie on Mar 10, 2010 7:05 PM

Your comment:

 (will show your gravatar)
 
Please add 6 and 2 and type the answer here: