Nhibernate LINQ приводит длинные к целым числам - PullRequest
0 голосов
/ 28 марта 2012

Я использую Fluent NHibernate (1.2.0.712) и Nhibernate.Linq (версия 1) с SQLite (1.0.79)

Вот моя модель:

public class QueueItem
{
    public virtual long ID { get; set; }
    public virtual DateTime AddedToQueue { get; set; }
    public virtual DateTime DontProcessUntil { get; set; }

    public virtual DataQueueItemState State { get; set; }
}

Примечаниечто идентификатор длинный.У меня также есть этот бит LINQ:

            var nextID =
                from i in _repository
                where i.State == DataQueueItemState.GetDataQueue && i.DontProcessUntil < DateTime.UtcNow
                group i by i.State into g
                select new { ID = g.Min(i => i.ID) };

_repository - хранилище уровня данных, реализующее IQueryable.

Этот запрос работает нормально.Однако, когда я посмотрел на сгенерированный SQL, я увидел следующее:

NHibernate: select cast(min(queueitem0_.ID) as INTEGER) as col_0_0_ from "QueueItem"
queueitem0_ where queueitem0_.State=@p0 and queueitem0_.DontProcessUntil<@p1 group by
queueitem0_.State;@p0 = 'GetDataQueue' [Type: String (0)], @p1 = 28/03/2012 08:21:10
[Type: DateTime (0)]

Вопрос в том;почему ID передается в INTEGER?На самом деле, почему он вообще приводится?

На стороне кода g.Min (i => i.ID) знает, что он возвращает long.Создается новый анонимный тип для хранения результата, и если я использую .elementAt (0) .ID для него, он также дает мне long, так что все выглядит нормально.

1 Ответ

1 голос
/ 10 апреля 2012

Вы видите преобразование, поскольку long не является типом данных sql. Я понимаю, что ваши столбцы SQLite могут не содержать типов, за исключением идентификатора, но NHibernate преобразует типы данных .NET в их sql-эквивалент. Я бы предложил использовать Int64 вместо long, чтобы быть в безопасности, но это ожидаемое поведение.

...