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)            
        }
    }

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

Fluent NHibernate 映射一个返回一组动态列的存储过程

而不是动态映射,您可以使用 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;
            }
        }
    }
}