【问题标题】:NHibernate List - Unable to cast object of type System.Collections.HashtableNHibernate 列表 - 无法转换 System.Collections.Hashtable 类型的对象
【发布时间】:2014-07-03 01:33:36
【问题描述】:

我正在尝试完成与SO Question 中描述的相同的事情。但是,回复中提到的解决方案并不能解决我的问题。

向我公开的 API 使用以下示例,出于特定目的而缩短

IList results = CurrentSession.CreateSQLQuery("exec myStoredProc ...")
  .SetParameters("..", ...)
  .SetResultTransformer(new NHibernate.Transform.AliasToEntityMapResultTransformer())
  .List();

然而,我需要这是一个 T 类型的特定对象,它是一个自定义对象。我尝试将其更改为使用 NHibernate List T() 但也没有运气。

如果我尝试强制转换,我通常会看到一条错误消息,指出 无法将“System.Collections.Hashtable”类型的对象大小写为“...”

有没有人遇到过类似的问题,并且知道如何将其转换/转换为与 System.Collections.Hashtable 不同的类型。我的主要目标是我需要使用 LINQ 语句来查询结果,并且不能用他代码返回的 IList 来做到这一点。

我正在尝试按原样使用 API 而不会更改,因为这已经在其他地方用于消费应用程序。因此,如果有一种方法可以使用 IList 并对其进行转换/转换,那是最好的。我知道这可能是由于使用了 NHibernate.Transform.AliasToEntityMapResultTransformer 而发生的。

感谢您的任何见解。我已经用谷歌搜索并搜索了这个,但到目前为止还没有找到答案。

【问题讨论】:

    标签: c# linq nhibernate casting


    【解决方案1】:

    这里的解决方案不应该那么复杂。如果您的实体看起来像:

    public class MyEntity 
    {
        public virtual int    Property1 { get; set; }
        public virtual string Property2 { get; set; }
        ...
    

    而存储过程的结果是这样的:

    SELECT col1 as Property1 // the same alias as property name is crucial
         , col2 as Property2
         ...
    

    我们可以从内置的AliasToBean<TEntity>()变压器中获利:

    IList<MyEntity> results = CurrentSession.CreateSQLQuery("exec myStoredProc ...")
      .SetParameters("..", ...)
      .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<MyEntity>())
      .List<MyEntity>();
    

    【讨论】:

    • 我已经有一段时间没有听到 AliasToBean 了,谢谢。 Jimmy Board 在Ad-hoc Mapping with NHibernate 上的一篇文章中也提到了这一点。感谢您的回复。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多