【发布时间】:2014-10-09 14:00:04
【问题描述】:
当我尝试从 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)
但是在执行一次选择之后,不知何故,下一个选择语句会为当前查询使用错误的类型(来自上一个查询?!?)...
解决方案是在每次选择之前放置 .Clone 以使查询保持默认状态:
s1.SelectSubQuery(subQuery.Clone().Select(smth.).WithAlias(some alias)
.SelectSubQuery(subQuery.Clone().Select(smth. else).WithAlias(other alias)
【问题讨论】:
-
这个概念是正确的。当然。我会说,您的代码中有一个隐藏的“错字”。检查this 以确保您走在正确的道路上。 SO:我会两次确保 DTO 和返回投影(WithAlias)确实匹配。如果你观察你传递的sn-p,有
mainQuery和m_Query...所以这两个不相关...
标签: .net nhibernate queryover