QueryOver选择DateTime会引发异常

时间:2014-10-09 14:00:04

标签: .net nhibernate queryover

当我尝试从DateTime类型的子查询(如QueryOver: select columns from subquery)中选择属性时,我得到以下异常:

The type System.DateTime can not be assigned to a property of type System.Int32

代码如下所示:

var subQuery = QueryOver.Of<Model>().Where(x => x.ForeignKey == someId);

mainQuery.SelectList(s1 =>
                    s1.SelectSubQuery(subQuery.Select(x => x.ChangeDate)).WithAlias(() => mainQueryAlias.ChangeDate)
                      .Select(...) //properties from mainQuery

mainQuery.TransformUsing(Transformers.AliasToBean<MainModel>());

其中ChangeDate的类型为DateTime。

例外情况发生在:

var expectResultList = mainQuery.List();

当我从选择列表中删除ChangeDate时,它可以正常工作。其他属性(如子查询中的类型int / string也可以成功选择。我想我必须在某处丢失一些转换,但我不知道在哪里。

解决方案:

问题是我使用相同的子查验多次来选择子查询的不同值:

s1.SelectSubQuery(subQuery.Select(smth.).WithAlias(some alias)
  .SelectSubQuery(subQuery.Select(smth. else).WithAlias(other alias)

然而,在执行一个select之后,不知何故,下一个select语句会使用错误的类型(来自普通查询?!?)用于当前查询......

解决方案是在每次选择之前放入.Clone以使查询保持其默认状态:

s1.SelectSubQuery(subQuery.Clone().Select(smth.).WithAlias(some alias)
  .SelectSubQuery(subQuery.Clone().Select(smth. else).WithAlias(other alias)

1 个答案:

答案 0 :(得分:1)

问题是我使用相同的子查验多次来选择子查询的不同值:

s1.SelectSubQuery(subQuery.Select(smth.)     .WithAlias(some alias)
  .SelectSubQuery(subQuery.Select(smth. else).WithAlias(other alias)

然而,在执行一个select之后,不知何故,下一个select语句会使用错误的类型(来自prevoius查询?!?)用于当前查询......

解决方案是在每次选择之前加上 .Clone ,以使查询保持默认状态:

s1.SelectSubQuery(subQuery.Clone().Select(smth.)     .WithAlias(some alias)
  .SelectSubQuery(subQuery.Clone().Select(smth. else).WithAlias(other alias)

经验教训:

  

如果您想多次执行相同的查询或创建单独的查询,请始终使用.Clone()