代码之家  ›  专栏  ›  技术社区  ›  Josh

nhibernate-迭代类的属性以一般地为存储过程添加参数

  •  0
  • Josh  · 技术社区  · 14 年前

    我希望有一个类为存储过程定义参数数据。它将是一个非常简单的对象:

    public class MyQueryData : SprocObjectBase
    {
       public int Value1 { get; set; }
       public string Value2 { get; set; }
       public bool Value3 { get; set; }
    ...
    }
    

    它将从具有共享值(如名称)的基类继承。

    public abstract class SprocObjectBase
    {
       public string SprocName { get; set; }
    }
    

    简单的类型便于转换。但是,这些对象将不止一个,而且每个都是不同的。

    然后,我希望能够迭代对象的属性,并将参数值添加到我的查询中,假设属性名是我的存储过程参数名。所以,我的代码看起来是这样的:

        public void Execute<T>(T entity) where T : SprocObjectBase
        {
            IQuery query = Session.GetNamedQuery(entity.SprocName);
    
            var properties = typeof(T).GetProperties();
    
            foreach (var prop in properties)
            {
                //??????????????
            }
    
            query.ExecuteUpdate();
        }
    

    我的问题是,我如何使用 query.SetParameter<>() 使用foreach循环中的属性信息将每个属性作为参数一般添加到存储过程中?

    编辑: 我当前的用法(未编译)如下所示:

    query.SetParameter<prop.GetType()>(prop.Name, prop.GetValue(entity, null));
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Stefan Steinegger    14 年前

    我没有尝试过,但是这样的方法应该有效:

        foreach (var prop in properties)
        {
            query.SetParameter(prop.Name, prop.GetValue(entity, null));
        }
    

    顺便说一句,直到现在,您还不需要使方法成为泛型的。无论如何,你在使用反射。