Fluent NHibernate 映射一个返回一组动态列的存储过程
本文关键字:动态 一组 存储过程 一个 NHibernate 映射 Fluent 返回 | 更新日期: 2023-09-27 18:32:54
我必须通过NHibernate访问一组存储过程。
其中一个存储过程返回结果,但返回的列因传入的参数而异。
例如,如果我传入日期 01/01/2014 和 01/01/2015,我可能会得到结果
列1、列 2、列 3
但是,如果我在不同的日期范围内传递,存储过程可能会返回一组不同的列,例如
列 1、列 2、列 3、列 4、列5、列 6
如何将其映射到实体?
是否有可能以某种方式有一个映射来映射所有可能返回的列,然后在列未从存储过程返回时将属性设置为 null?
public class ModelMap : ClassMap<Model>
{
public ModelMap()
{
this.ReadOnly();
this.Id(x => x.Date);
this.Map(x => x.Column1)
this.Map(x => x.Column2)
this.Map(x => x.Column3)
this.Map(x => x.Column4)
this.Map(x => x.Column5)
this.Map(x => x.Column6)
}
}
关于如何让这种类型的存储过程映射到实体的任何想法?
而不是动态映射,您可以使用 SQLQuery 发出查询并使用结果转换器手动转换结果
public List<Model> CallFoo(ISession session, DateRange range)
{
return session.CreateSqlQuery("call sproc")
.SetParameter(...)
.SetResultTransformer(new ModelResultTransformer())
.List<Model>();
}
class ModelResultTransformer : NHibernate.Transform.IResultTransformer
{
public IList TransformList(IList collection)
{
return collection;
}
public object TransformTuple(object[] tuple, string[] aliases)
{
var model = new Model();
for (int i = 0; i < aliases.Length; i++)
{
var columnName = aliases[i];
var value = tuple[i];
switch (columnName)
{
case "column1":
model.Prop1 = (string)value;
break;
case "column2":
model.Prop2 = (int)value;
break;
case "column3":
model.Prop1 = (int)value;
break;
}
}
}
}