简体   繁体   English

使用 SqlQuery 处理来自存储过程的多个结果

[英]Handle multiple result from a stored procedure with SqlQuery

I have a stored procedure which returns a multiple set of results (two tables).我有一个存储过程,它返回多组结果(两个表)。 I call the stored procedure like this:我这样调用存储过程:

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 contains two List<> properties, for the result set, but the lists are empty after the call.我的 RefererStatisticResult 包含两个 List<> 属性,用于结果集,但调用后列表为空。 How can I handle the result set?如何处理结果集? Is it possible with the SqlQuery? SqlQuery 可以吗?

The DbContext has no native support for materialising multiple resultsets. DbContext没有对实现多个结果集的本机支持。 However, it is reasonably straight forward to achieve by dropping down to the ObjectContext and using the Translate method to copy results from a DbDataReader into entities in your domain model.但是,通过下拉到ObjectContext并使用Translate方法将结果从DbDataReader复制到域模型中的实体中,这是相当直接的。

Here's some example code.这是一些示例代码。 This assumes your ReferrerStatisticResult is just a container for the two lists called Set1 and Set2 .这假设您的ReferrerStatisticResult只是名为Set1Set2的两个列表的容器。 Obviously adjust according to your actual domain model.显然根据您的实际域模型进行调整。

// 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();
    }
}

I think following code could help you.我认为以下代码可以帮助您。

 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;

Ref: Click here参考: 点击这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM