当我尝试从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)
答案 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()
!