2011-03-21 2 views
2

Я использую NHibernate -driven хранилище, Fluent сопоставления и попытки использовать Linq to NHibernate.C# NHibernate Simple Question

Но для некоторого простого запроса, как этот

Retrieve<XValue>(x => (x.Timestamp.CompareTo(start) >= 0 && 
         x.Timestamp.CompareTo(end) <= 0)); 

// 'Retrieve' here acts simply as 'session.Query<T>().Where(expression);' 

я получаю следующий результат:

System.NotSupportedException: Int32 CompareTo(System.DateTime) 

Я не знаю, почему, но CompareTo операции не по прогнозам, база данных и выход также являются довольно странными:

create table "QuotUnitDescriptor" (
    Id integer, 
    PaperId INTEGER, 
    Timestamp DATETIME, 
    InPaperIdx INTEGER, 
    primary key (Id) 
) 

NHibernate: INSERT INTO "QuotUnitDescriptor" ...................... 

// Many INSERT's 

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ 
    from "QuotUnitDescriptor" binaryunit0_ 

Не могу понять, почему эта операция вызывает операцию select -> integer.

Как реализовать следующий ориентированный на дату запрос?(с использованием Linq лучше, но критерии также прекрасны, я думаю).

+0

Вы сравниваете свою метку времени с 0. Может быть, поэтому? – Vadim

+0

@Yads Я сравниваю это с отметками 'start' и' end' в моем коде. –

ответ

5

NHibernate.Linq поставщик не может преобразовать CompareTo позвонить в sql.

использовать что-то вроде:

Retrieve<XValue>(x => x.Timestamp>start && x.Timestamp<end); 

P.S. и избегать репозиториев. Это наивная абстракция.

+0

Спасибо. Не могли бы вы прокомментировать ваше заявление о репозиториях. Какие абстракции я должен использовать вместо них? Те, которые более специфичны для домена? –

+1

@ Yippie-Kai-Yay, если вы используете NHibernate, не пытайтесь отвлечь его. Убедитесь, что вы хотите связать себя с ним, и как только вы это сделаете - живите с этим. Кажется прекрасным (использование репозиториев) только до тех пор, пока вы не начнете сталкиваться с более глубокими графами объектов и проблемами производительности. Более выгодно гарантировать, что у вас есть богатая модель домена, которая корректно проверяет правильность состояния, а не пытается абстрагироваться от скучной «прочитанной» стороны вашего приложения. http://ayende.com/Blog/archive/2011/03/16/architecting-in-the-pit-of-doom-the-evils-of-the.aspx –