【问题标题】:Cast an IList to an IList<t> using dynamic instantiation使用动态实例化将 IList 强制转换为 IList<t>
【发布时间】:2009-12-29 22:21:08
【问题描述】:

我正在尝试使用动态实例化将以下 NHibernate 查询转换为 IList 而不是 IList。

IList<AllName> allNames =
  (IList<AllName>)Session.CreateQuery(
  @"select new AllName(
  name.NameId, name.FirstName, origin.OriginId, origin.Description,
  name.Sex, name.Description, name.SoundEx
  ) from Name name join name.Origin origin")
  .SetFirstResult(skip)
  .SetMaxResults(pageSize);

运行这个我得到以下错误:-

无法转换类型的对象 'NHibernate.Impl.QueryImpl' 键入 'System.Collections.Generic.IList`1[Domain.Model.Entities.AllName]'。

我知道我可以回来

IList results = Sesssion.CreateQuery(...

但我的服务层需要一个

IList<AllName>

我怎样才能做到这一点?

【问题讨论】:

    标签: nhibernate casting ilist


    【解决方案1】:

    一种选择是编写一个代理到IListIList&lt;T&gt; 实现,并在适当的情况下进行转换。做起来应该不会太难,虽然有点乏味。 LINQ 将在实现 IEnumerable&lt;T&gt; 等方面稍微容易一些 - 例如,您可以调用底层迭代器并在其上调用 Cast&lt;T&gt;()

    另一种解决方案是从返回的列表中创建一个新的List&lt;T&gt;

    IList query = Session.CreateQuery(...);
    IList<AllName> allNames = new List<AllName>(query.Cast<AllName>());
    

    编辑:正如 Sander 正确指出的那样,这就是 ToList 的用途:

    IList query = Session.CreateQuery(...);
    return query.Cast<AllName>().ToList();
    

    编辑:所有这些都与 NHibernate 无关,实际上我对 NHibernate 知之甚少。 Rippo 现在找到了一个更简单的答案 - 改为调用 List&lt;AllName&gt;(这是一种 NHibernate 方法)。

    【讨论】:

    • 当您使用.Cast&lt;T&gt;() 扩展方法时,您也可以添加一个.ToList()
    • 感谢乔恩,演员工作。这里有什么表现吗?我的页面大小设置为 50 条记录,因此我不会返回大量数据。
    • @sander: 哦!为什么没有。我想那个? :)
    • 乔恩,找到了另一种方式,只是发帖以防其他人看到这篇文章。我可以简单地做 return query.List();
    • @Rippo:这就是我对 NHibernate 缺乏了解让我失望的地方 :) 我会将其编辑到答案中,以使其更加明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多