使用动态实例化将IList转换为IList <t> </t>

时间:2009-12-29 22:21:08

标签: nhibernate casting ilist

我尝试使用动态实例化将以下NHibernate查询转换为IList&lt; t&gt;而不是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>

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:5)

一种选择是编写代理IList<T>的{​​{1}}实现,并在适当的时候进行投射。它应该不会太难,虽然有点单调乏味。 LINQ将在实现IList等方面稍微简化一下 - 例如,您可以调用底层迭代器并在其上调用IEnumerable<T>

另一种解决方案是从返回的列表中创建一个新的Cast<T>()

List<T>
编辑:正如桑德所指出的那样,这就是IList query = Session.CreateQuery(...); IList<AllName> allNames = new List<AllName>(query.Cast<AllName>()); 的用途:

ToList

编辑:所有这些都是NHibernate不可知的,因为它 - 我实际上并不了解NHibernate。 Rippo现在找到了一个更简单的答案 - 调用IList query = Session.CreateQuery(...); return query.Cast<AllName>().ToList(); 代替(这是一个NHibernate方法)。