Fluent NHibernate映射存储过程,该过程返回动态的列集

时间:2014-12-03 15:17:21

标签: c# sql-server stored-procedures nhibernate fluent-nhibernate

我必须通过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)            
        }
    }

关于如何让这种类型的存储过程映射到实体的任何想法?

1 个答案:

答案 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;
            }
        }
    }
}