Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Behandeln Sie mehrere Ergebnisse aus einer gespeicherten Prozedur mit SqlQuery

Der DbContext hat keine native Unterstützung für die Materialisierung mehrerer Ergebnismengen. Es ist jedoch relativ einfach zu erreichen, indem Sie auf ObjectContext herunterfallen und mit Translate Methode zum Kopieren von Ergebnissen aus einem DbDataReader in Entitäten in Ihrem Domänenmodell.

Hier ist ein Beispielcode. Dies setzt Ihr ReferrerStatisticResult voraus ist nur ein Container für die beiden Listen namens Set1 und Set2 . Passen Sie dies natürlich an Ihr aktuelles Domänenmodell an.

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