С# Лямбда-выражения и NHibernate

Я новичок в великом мире NHibernate. Я использую версию 2.0.1.GA. Вот мой вопрос. У меня есть таблица Cars со столбцом Manufacturer(nvarchar(50)) и первичный ключ ID(int). Мой класс .NET:

public class Car
{
    public virtual int ID { get; set; }
    public virtual string Manufacturer { get; set; }
}

Теперь, если я хочу получить все автомобили, сделанные Mercedes, я должен набрать это:

using (var session = OpenSession())
{
    var cars = session
        .CreateCriteria(typeof(Car))
        .Add(Restrictions.Like("Manufacturer", "Mercedes"))
        .List();
    // ...
}

Мне не нравится тот факт, что мне нужно указать имя свойства как строку:( Возможно ли иметь что-то более подходящее для рефакторинга (это только предложение)?

var ms = session
    .CreateCriteria<Car>()
    .Add(c => c.Manufacturer, Restrictions.Like("Mercedes")
    .List();

Что-нибудь вроде thins в текущей версии (2.0.1.GA) или в будущей версии?

Ответы

Ответ 1

Как и Google Ninja, вы можете сделать это с помощью NHibernate.Linq. Тогда запрос будет выглядеть следующим образом:

session.Linq<Car>.Where(c => c.Manufacturer == "Mercedes").ToList()

Если кто-то заканчивается здесь и использует NH3.0, синтаксис просто немного отличается (спасибо Майклу Мрозеку и Майку за предложение):

session.Query<Car>.Where(c => c.Manufacturer == "Mercedes").ToList()

Я использовал двоичный файл, который поставляется в комплекте с fluent-nhibernate, который работает с 2.0GA (я думаю, не уверен в конкретном редакция).

Ответ 3

Возможно, вы можете сделать это с помощью NHibernate.Linq. Он в удобной форме, но все же путь от завершения. В настоящее время он живет внутри nhcontrib, единственный способ получить его - вытащить его из svn здесь https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Linq/

Ответ 4

Посмотрите этот вопрос здесь. У кого-то было такое же беспокойство, и я могу собрать, NHibernate.Linq хорошо жив.