如何在 C# 中将 nhibernate List 转换为 IList<T>

How to convert nhibernate List to IList<T> in C#

我有一个来自 NHibernate 结果集的模型对象列表,希望有一个通用方法将其转换为 IList

我有这个

var l = session.CreateSQLQuery(@query).SetResultTransformer(Transformers.AliasToEntityMap).List();

需要转换为

IList<T> ls = new List<T>();

这样从 nhibernate 返回的任何列表都可以轻松匹配到任何模型 class

我试过了

List<T> newList = l.Cast<T>().ToList();

但出现错误

System.InvalidCastException: Unable to cast object of type 'System.Collections.Hashtable' to type SalesModel 

其中 SalesModel 是 T 我的通用模型

也试过了

var l = session
    .CreateSQLQuery(@query)
    .SetResultTransformer(Transformers.AliasToBean<SalesModel>())
    .List();

IList<SalesModel> newList = l.Cast<SalesModel>().ToList();

并收到此错误

A first chance exception of type 'NHibernate.PropertyAccessException' occurred in NHibernate.dll
NHibernate.PropertyAccessException: The type System.Decimal can not be assigned to a property of type System.Int32 setter of model.SalesModel.total ---> System.ArgumentException: Object of type 'System.Decimal' cannot be converted to type 'System.Int32'.

这是我的模型class

  public class SalesModel
    {
        public virtual String barcode { get; set; }
        public virtual String product_name { get; set; }
        public virtual int total { get; set; }
   
    }
 

问题是返回的集合 l 包含 System.Collections.Hashtable 类型的项目。这是因为您使用了 Transformers.AliasToEntityMap 表示:

Each row of results is a map (System.Collections.IDictionary) from alias to values/entities.

要制作 SalesModel 类型的物品,您需要使用 Transformers.AliasToBean<SalesModel>() 其中:

Creates a result transformer that will inject aliased values into instances of T via property methods or fields.

然后你可以转换它或使用 List<T>() 代替:

IList<SalesModel> list = session
    .CreateSQLQuery(@query)
    .SetResultTransformer(Transformers.AliasToBean<SalesModel>())
    .List<SalesModel>();