NHibernate hql 元组结果
NHibernate hql tuple result
hql = "select f, b from Foo f, Bar b"
var resultList = session.CreateQuery(hql).List<object[]>();
结果列表项是一个数组,其中 [0] 是 Foo 类型,[1] id 是 Bar 类型
有没有办法使用 Tuple(或其他通用 class )作为 object[] 的通用参数,这样就可以跳过转换?
是的,你可以,比如:
// The new Tuple<Foo, Bar>(foo, bar) constructor
Type constructor = typeof(Tuple<Foo, Bar>).GetConstructors()[0];
然后
.SetResultTransformer(Transformers.AliasToBeanConstructor(constructor));
在.List()
之前
附录
我查看了 我的 代码(因为我在一两年前就已经这样做了 :)),我注意到我更喜欢
Type constructor = typeof(Tuple<Foo, Bar>).GetConstructor(new[] { typeof(Foo), typeof(Bar) });
对此有一个非常好的推理:现在(从 .NET 4.5.1 开始)Tuple<T1, T2>
有一个 public 构造函数,即 new Tuple(T1 t1, T2 t2)
。 没有隐式或显式保证在.NET的未来版本中不会有Tuple<T1, T2>
的无参数public构造函数return 一个 "empty" 元组。较长的 GetConstructor
形式保证 "right" 构造函数将始终被采用。
hql = "select f, b from Foo f, Bar b"
var resultList = session.CreateQuery(hql).List<object[]>();
结果列表项是一个数组,其中 [0] 是 Foo 类型,[1] id 是 Bar 类型
有没有办法使用 Tuple
是的,你可以,比如:
// The new Tuple<Foo, Bar>(foo, bar) constructor
Type constructor = typeof(Tuple<Foo, Bar>).GetConstructors()[0];
然后
.SetResultTransformer(Transformers.AliasToBeanConstructor(constructor));
在.List()
附录
我查看了 我的 代码(因为我在一两年前就已经这样做了 :)),我注意到我更喜欢
Type constructor = typeof(Tuple<Foo, Bar>).GetConstructor(new[] { typeof(Foo), typeof(Bar) });
对此有一个非常好的推理:现在(从 .NET 4.5.1 开始)Tuple<T1, T2>
有一个 public 构造函数,即 new Tuple(T1 t1, T2 t2)
。 没有隐式或显式保证在.NET的未来版本中不会有Tuple<T1, T2>
的无参数public构造函数return 一个 "empty" 元组。较长的 GetConstructor
形式保证 "right" 构造函数将始终被采用。