Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Gérer plusieurs résultats d'une procédure stockée avec SqlQuery

Le DbContext n'a pas de support natif pour matérialiser plusieurs jeux de résultats. Cependant, il est raisonnablement simple à réaliser en descendant jusqu'à ObjectContext et en utilisant le Translate méthode pour copier les résultats d'un DbDataReader en entités dans votre modèle de domaine.

Voici un exemple de code. Cela suppose votre ReferrerStatisticResult est juste un conteneur pour les deux listes appelées Set1 et Set2 . Ajustez évidemment en fonction de votre modèle de domaine actuel.

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