SqlServer2008/2012のタイプに論理的にマップされるNodaTimeタイプIUserType
のNHibernateを作成しようとしています。データベースから値の保存と読み込みを取得できます。ただし、エラーが発生するような現地時間の比較を含むクエリを作成することはできませんLocalTime
time
_session.Query<SchedulingTemplate>().Where(x => x.Start < end && x.End >= start)
SqlException (0x80131904): The data types time and datetime are incompatible in the less than operator.
私のユーザータイプの関連コードは次のとおりです。
public Type ReturnedType
{
get { return typeof(LocalTime); }
}
public override object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var dbValue = NHibernateUtil.Time.NullSafeGet(rs, names);
if(dbValue == null)
return null;
return LocalDateTime.FromDateTime((DateTime)dbValue).TimeOfDay;
}
public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
if(value == null)
NHibernateUtil.Time.NullSafeSet(cmd, null, index);
else
NHibernateUtil.Time.NullSafeSet(cmd, ((LocalTime)value).LocalDateTime.ToDateTimeUnspecified(), index);
}
public override SqlType[] SqlTypes
{
get { return new[] { SqlTypeFactory.Time }; }
}
問題は、データベースタイプが時間であることを示す上記のコードにもかかわらず、次のクエリを生成することです(SQLプロファイラーごと)。
exec sp_executesql N'select [...] from [SchedulingTemplate] scheduling0_ where scheduling0_.Start<@p0 and scheduling0_.[End]>=@p1',N'@p0 datetime,@p1 datetime',@p0='1753-01-01 20:00:00',@p1='1753-01-01 06:00:00'
(簡潔にするために選択リストを省略したことに注意してください)
パラメータのタイプと値がとして扱われていることに注意してくださいdatetime
。
これは、 https ://nhibernate.jira.com/browse/NH-2661およびhttps://nhibernate.jira.com/browse/NH-2660でクローズされた2つのNHバグと非常によく似ているようです。
使ってみましたがNHibernateUtil.TimeAsTimeSpan
、うまくいかなかったようです。それは私を驚かせたのとまったく同じクエリを生成しました。NH-2661で説明されている問題は、ユーザータイプにも存在し、修正されていないと思いますか?
NHibernatev3.3.1.400とNodaTime1.0.0-beta2を使用しています