0

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

我怎样才能做到这一点?

4

1 回答 1

5

一种选择是编写一个实现,在适当的情况下IList<T>代理, 强制转换。IList做起来应该不会太难,虽然有点乏味。LINQ 将使这在实现IEnumerable<T>等方面稍微容易一些 - 例如,您可以调用底层迭代器并调用Cast<T>()它。

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

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

编辑:正如桑德正确指出的那样,这ToList是为了:

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

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

于 2009-12-29T22:26:50.847 回答