我尝试使用动态实例化将以下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>
我怎样才能做到这一点?
答案 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方法)。