我必须通过NHibernate访问一组存储过程。
其中一个存储过程返回结果,但返回的列根据传入的参数而不同。
例如,如果我传递日期01/01/2014和01/01/2015,我可能会得到结果
column1,column2,column3
但是,如果我传入不同的日期范围,则存储过程可能会返回一组不同的列,例如
column1,column2,column3,column4,column5,column6
如何将其映射到实体?
是否有可能以某种方式有一个地图来映射可能返回的所有列,然后如果列不从存储过程返回,则将属性设置为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)
}
}
关于如何让这种类型的存储过程映射到实体的任何想法?
答案 0 :(得分:4)
而不是动态映射,您可以使用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;
}
}
}
}