代码之家  ›  专栏  ›  技术社区  ›  Amit Joshi user8575948

NHibernate:如何使用IQuery将存储过程返回的List<object>转换为List<Entity>?

  •  0
  • Amit Joshi user8575948  · 技术社区  · 4 年前

    以下是我的存储过程:

    CREATE PROCEDURE [dbo].[GetProducts_SP]
    AS
    BEGIN
        SELECT * FROM Products
    END
    

    这是我的代码:

    // This code works
    IList<ProductsEntity> list = session.QueryOver<ProductsEntity>().List<ProductsEntity>();
    
    // This also works; I get expected data in `object`
    string sql = null;
    sql = "EXEC GetProducts_SP";
    IQuery query = session.CreateSQLQuery(sql);
    IList<object> listSP = query.List<object>();
    

    As session.QueryOver 工作正常,实体定义或映射没有问题。这就是为什么,我没有发布表定义、实体类和映射。

    如上面的代码所示,我正确地获取了数据 List<object> 从存储过程中。
    此外,我想转换这个 object 数据到实体。
    为此,我使用以下代码:

    //Following fail
    IList<ProductsEntity> listSPEntity = query
        .List<ProductsEntity>();
    

    此操作失败,但有一个例外:

    系统。ArgumentException:值“System.Object[]”不是“Products Entity”类型,不能在此泛型集合中使用。

    这似乎很明显,因为NHibernate本身无法转化 对象 到实体。
    所以我用transformer来指导NHibernate如何用下面的代码做到这一点:

    // This fails
    IList<ProductsEntity> listSPEntity = query
        .SetResultTransformer(Transformers.DistinctRootEntity)
        .List<ProductsEntity>();
    

    此操作失败,但有一个例外:

    系统。ArgumentException:值“True”不是“Products Entity”类型,不能在此泛型集合中使用。

    如何转换a 列表<对象> 由存储过程返回给 List<Entity> 使用 IQuery ?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Amit Joshi user8575948    4 年前

    这个 Transformers.DistinctRootEntity 这肯定不是正确的工具。此转换器预期结果中已准备好的实体。而且没有 AddEntity call,你有数组 object 按照你的程序返回 new object[]{10, "Name", true} .

    ISQLQuery 您必须通过手动注册返回的实体 添加实体 呼叫:

    string sql = null;
    sql = "EXEC GetProducts_SP";
    var results = session.CreateSQLQuery(sql)
                    .AddEntity(typeof(ProductsEntity).FullName)
                    .List<ProductsEntity>();
    

    请注意 添加实体 可在 ISQL查询 返回由 CreateSQLQuery 。它不适用于 IQuery 您在示例中使用的。