【问题标题】:QueryOver Selecting DateTime throws exceptionQueryOver 选择 DateTime 引发异常
【发布时间】: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,有mainQuerym_Query...所以这两个不相关...

标签: .net nhibernate queryover


【解决方案1】:

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

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)

经验教训:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多