我正在使用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,那么它给了我很长的时间以便所有看起来都很好。
答案 0 :(得分:1)
您正在看转换,因为long不是sql数据类型。我知道你的SQLite列可以是无类型的,除了ID,但NHibernate将.NET数据类型转换为它们的sql等价物。我建议使用Int64而不是长期只是为了安全,但这是预期的行为。