Nhibernate LINQ强制转换为整数

时间:2012-03-28 08:32:19

标签: linq-to-nhibernate

我正在使用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; }
}

请注意,ID很长。 我也有这点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 =&gt; i.ID)知道它返回了一个long。 正在生成一个新的匿名类型来保存结果,如果我对它执行了.elementAt(0).ID,那么它给了我很长的时间以便所有看起来都很好。

1 个答案:

答案 0 :(得分:1)

您正在看转换,因为long不是sql数据类型。我知道你的SQLite列可​​以是无类型的,除了ID,但NHibernate将.NET数据类型转换为它们的sql等价物。我建议使用Int64而不是长期只是为了安全,但这是预期的行为。