NHibernate使用CreateCriteria按datetime2(7)排序异常求助
解决NHibernate CreateCriteria按datetime2(7)字段排序失效的问题
我之前也碰到过类似的datetime2字段排序异常的情况,咱们一步步来排查和解决这个问题:
首先排查最可能的问题:投影(Projection)与返回类型不匹配
你的代码里设置了SetProjection(projection)来只选取date字段,但最后却用List<KnihovnaNovinky>来接收结果——这本身就存在矛盾:投影只返回单个日期字段,NHibernate无法将其映射为完整的KnihovnaNovinky实体,这种隐式转换很可能干扰了排序逻辑的执行。
修正方案分两种情况:
- 如果你需要返回完整的
KnihovnaNovinky实体:直接移除SetProjection,因为投影会限制查询返回的字段,不需要的时候完全可以去掉:
return session .CreateCriteria<KnihovnaNovinky>() .Add(Restrictions.Like("Type", type)) .AddOrder(Order.Desc("Date")) // 注意这里的名称要和实体属性名完全一致(大小写敏感) .List<KnihovnaNovinky>();
- 如果你确实只需要
Date字段:把返回类型改成List<DateTime>,同时统一字段名的大小写(比如都用"Date",和实体属性名保持一致):
var projection = Projections.Property("Date"); return session .CreateCriteria<KnihovnaNovinky>() .Add(Restrictions.Like("Type", type)) .SetProjection(projection) .AddOrder(Order.Desc("Date")) .List<DateTime>();
其次检查NHibernate映射配置
确保你的KnihovnaNovinky实体中Date属性的映射正确对应到数据库的datetime2(7)类型:
- 如果是XML映射:
<property name="Date" column="Date" type="DateTime2" length="7" />
- 如果是Fluent NHibernate:
Map(x => x.Date).Column("Date").CustomType<DateTime2>().Precision(7);
如果映射类型错误(比如默认映射成DateTime),可能会导致NHibernate处理日期精度时出错,进而影响排序结果。
其他排查点
- 字段名大小写一致性:确认
Order.Desc("Date")中的字符串和实体类的属性名完全一致(NHibernate对大小写敏感,比如实体属性是Date就别写成date)。 - 缓存干扰:如果之前的查询结果被NHibernate缓存了,可能会看到旧的排序结果,可以在查询前清空会话缓存试试:
session.Clear(); // 清空当前会话的缓存 // 再执行你的查询代码
- Null值影响:如果数据库中
Date字段存在null值,排序时null会默认排在最前或最后,看起来像是排序失效,你可以加个过滤条件排除null值:
.Add(Restrictions.IsNotNull("Date"))
内容的提问来源于stack exchange,提问作者user9257592
相关产品推荐
相关产品推荐

