C# 为什么CreateSQLQuery引发异常“值系统.Object[]不是类型,不能在此泛型集合中使用”?
我有以下数据库表:C# 为什么CreateSQLQuery引发异常“值系统.Object[]不是类型,不能在此泛型集合中使用”?,c#,nhibernate,C#,Nhibernate,我有以下数据库表: CREATE TABLE A ( [Id] [INT] IDENTITY (1,1) NOT NULL CONSTRAINT A_P_KEY PRIMARY KEY, [X] [INT] ) 以下是实体类: public class A { public virtual int Id { get; set; } public virtual int X { get; set; } } 以下是地图: internal class AConfigurat
CREATE TABLE A
(
[Id] [INT] IDENTITY (1,1) NOT NULL CONSTRAINT A_P_KEY PRIMARY KEY,
[X] [INT]
)
以下是实体类:
public class A
{
public virtual int Id { get; set; }
public virtual int X { get; set; }
}
以下是地图:
internal class AConfiguration : ClassMapping<A>
{
public AConfiguration()
{
Table("A");
Id(x => x.Id, im =>
{
im.Column("Id");
im.Generator(Generators.Identity);
});
Property(x => x.X, map => map.NotNullable(true));
}
}
如上所示,QueryOver调用工作正常。但是CreateSQLQuery调用失败,出现以下异常:
System.ArgumentException was unhandled
HResult=-2147024809
Message=The value "System.Object[]" is not of type "[....].A" and cannot be used in this generic collection.
Parameter name: value
ParamName=value
Source=mscorlib
StackTrace:
at System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType)
at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item)
at NHibernate.Util.ArrayHelper.AddAll(IList to, IList from)
at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results)
at NHibernate.Impl.AbstractSessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results)
at NHibernate.Impl.AbstractSessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters)
at NHibernate.Impl.SqlQueryImpl.List[T]()
at [....]
InnerException:
为什么CreateSQLQuery调用引发异常
问题的答案没有帮助,因为我正在从表中选择所有列;这个问题涉及选择有限的列。CreateSQLQuery API将返回对象数组System.object[]。尝试将此对象数组映射到实体时出现异常
你有两种方法:
手动获取对象数组和映射
您可以使用session.CreateSQLQuerysql.List获取对象数组,并使用自定义逻辑进一步映射它。有关更多详细信息,请参阅或参考资料
指导NHibernate如何映射它
NHibernate有一种叫做变压器的功能。转换器有助于映射复杂对象。您可以使用如下所示的一种:
lst = session.CreateSQLQuery(sql)
.SetResultTransformer(Transformers.AliasToBean<A>())
.List<A>()
.ToList();
有关更多详细信息,请参阅参考资料
lst = session.CreateSQLQuery(sql)
.SetResultTransformer(Transformers.AliasToBean<A>())
.List<A>()
.ToList();