LINQ provides a way to strongly type your queries, but there are still times when you want an opaque query language with an object-oriented interface.
With .Net 3.5 came Lambda Expressions, which allow you to strongly type the individual expressions in a query. I started writing some extension methods to allow me to use lambda expressions with ICriteria, so code like:
mySession .CreateCriteria(typeof(Person)) .Add(Expression.Eq("Name", "smith")) .List<Person>();
... turns into code like:
mySession .CreateCriteria(typeof(Person)) .Add<Person>(p => p.Name == "smith") .List<Person>();
There turned out to be quite a few extension methods to write to cover all the different combinations of ICriteria that can be written (including DetachedCriteria, aliases, subqueries, ...) I've packaged it into a project on Google Code for anyone who wants to use it: