0

任何人都可以帮我一些想法吗?下面是我的问题。假设我有一个名为 A 的实体,其字段为 A1、A2、A3 和 A4,而且我有 3 个存储过程,它们仅从表 A 返回数据。

(注:表 A 只有 4 列 A1、A2、A3、A4)。

第一个存储过程返回 A1、A2 第二个存储过程返回 A1、A2、A3 第三个存储过程单独返回 A1。

对于上述场景,我需要创建三个不同的映射还是有任何解决方法?如何使用单个实体 A 和更少的更改代码来处理这种场景......

我的场景:

public IList<Userdatasw> Find(string userName)
        {
            var s = ServiceLocator.Resolve<IeGoatSessionFactory>().OpenSession();

            // Executing the stored procedure 
            IList userList1 = s.CreateSQLQuery("exec dbo.IFSEntry @UserName=:UserName")
                .AddScalar("Password", NHibernateUtil.String)
                .AddScalar("UserLevel", NHibernateUtil.Int32)
                .AddScalar("UserName", NHibernateUtil.String)
                .AddScalar("EmployeeId", NHibernateUtil.String)
                .AddScalar("SenAccntManager", NHibernateUtil.String)
                .AddScalar("updaterequired", NHibernateUtil.String)
                .SetParameter("UserName", userName).List();

            // Trying to cast anonymous type to Userdatasw
            IList<Userdatasw> userdatasw1 = userList1.OfType<Userdatasw>().ToList();
            return userdatasw1;

        }

在上面的代码中,返回类型是 Ilist,但我需要将其转换为 Userdatasw,代码更改较少。我在 Nhiberante 中看到了很多解释“从存储过程填充实体”的链接,但我有 20 个字段的实体,并且在上面的 SP 中只返回 6 个值。

那么对于每个返回相同类型的 SP,我们需要创建单独的映射吗?

任何想法将不胜感激。

谢谢,文卡特什。Ĵ

4

1 回答 1

0

大家好,我有解决方案。如果我们使用 SetResultTransformer 就很简单。

    public IList<Userdatasw> Find(string userName)
    {
        var s = ServiceLocator.Resolve<IeGoatSessionFactory>().OpenSession();

        IQuery query = s.CreateSQLQuery("exec dbo.IFSEntry @UserName=:UserName")
                          .AddScalar("Password", NHibernateUtil.String)
                          .AddScalar("UserLevel", NHibernateUtil.Int32)
                          .AddScalar("UserName", NHibernateUtil.String)
                          .AddScalar("EmployeeId", NHibernateUtil.String)
                          .AddScalar("SenAccntManager", NHibernateUtil.String)
                          .AddScalar("updaterequired", NHibernateUtil.String)
                          .SetResultTransformer(Transformers.AliasToBean(typeof(Userdatasw)))
                          .SetParameter("UserName", userName);
        return query.List<Userdatasw>();
    }
于 2012-04-13T09:00:19.777 回答