【问题标题】:Handle multiple result from a stored procedure with SqlQuery使用 SqlQuery 处理来自存储过程的多个结果
【发布时间】:2014-08-14 09:36:17
【问题描述】:

我有一个存储过程,它返回多个结果集(两个表)。我这样调用存储过程:

var result = context.Database.SqlQuery<RefererStatisticResult>(
"exec [dbo].[GetReferrer] @StartDate, @EndDate, @Source",
this.CreateInParam("@StartDate", SqlDbType.DateTime, startDate),
this.CreateInParam("@EndDate", SqlDbType.DateTime, endDate),
this.CreateInParam("@Source", SqlDbType.SmallInt, eventSourveVal)).ToArray();

My RefererStatisticResult 包含两个 List 属性,用于结果集,但调用后列表为空。如何处理结果集? SqlQuery 可以吗?

【问题讨论】:

    标签: c# sql-server entity-framework stored-procedures


    【解决方案1】:

    DbContext 不支持实现多个结果集。但是,通过下拉到 ObjectContext 并使用 Translate 方法将结果从 DbDataReader 复制到域模型中的实体中,这是相当直接的。

    这是一些示例代码。这假设您的 ReferrerStatisticResult 只是名为 Set1Set2 的两个列表的容器。显然要根据你的实际领域模型进行调整。

    // Create container ready for the resultsets
    var result = new RefererStatisticResult();
    
    using (var myContext = new MyContext())
    {
        // Create command from the context in order to execute
        // the `GetReferrer` proc
        var command = myContext.Database.Connection.CreateCommand();
        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.CommandText = "[dbo].[GetReferrer]";
        // add in command parameters
        // (not shown)
    
        try
        {
            myContext.Connection.Open();
            var reader = command.ExecuteReader();
    
            // Drop down to the wrapped `ObjectContext` to get access to
            // the `Translate` method
            var objectContext = ((IObjectContextAdapter)myContext).ObjectContext;
    
            // Read Entity1 from the first resultset
            result.Set1 = objectContext.Translate<Entity1>(reader, "Set1", MergeOptions.AppendOnly);
    
            // Read Entity2 from the second resultset
            reader.NextResult();
            result.Set2 = objectContext.Translate<Entity2>(reader, "Set2", MergeOptions.AppendOnly);        
        }
        finally
        {
            myContext.Database.Connection.Close();
        }
    }
    

    【讨论】:

    • 翻译非 EF 模型/实体,不要指定实体集名称:var data = objectContext.Translate&lt;CustomEntity&gt;(reader).ToList();
    • 这是MergeOption 不是以s 结尾的
    【解决方案2】:

    我认为下面的代码可以帮助你。

     MultiResultDomain domainEntity = new MultiResultDomain();
         var command = _DatabaseContext.Database.Connection.CreateCommand();
         command.CommandText = "[dbo].[SPR_GETMultipleResultSP]";
         command.CommandType = CommandType.StoredProcedure;
         try
         {
             _DatabaseContext.Database.Connection.Open();
             var reader = command.ExecuteReader();
    
         List<customcustomer> _listOfCustomer =
         ((IObjectContextAdapter)_DatabaseContext).ObjectContext.Translate<customcustomer>
         (reader).ToList();
             reader.NextResult();
             List<customproduct> _listOfProduct =
                 ((IObjectContextAdapter)_DatabaseContext).ObjectContext.Translate<customproduct>
         (reader).ToList();
    
             foreach (var cust in _listOfCustomer)
             {
                 Console.WriteLine("Name: Mr.{0} And Country: {1}", cust.FirstName,
                 cust.Country);
             }
    
             foreach (var product in _listOfProduct)
             {
                 Console.WriteLine("ProductName: {0} And Package: {1}",
                 product.ProductName, product.Package);
             }
    
             domainEntity.Customer = _listOfCustomer;
             domainEntity.Product = _listOfProduct;
             return domainEntity;
    

    参考:Click here

    【讨论】:

    • 接受的答案正是如此。没有理由重复它。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多