2010-12-22 6 views
4

Um eine Seite anzuzeigen, muss ich eine Menge Informationen aus verschiedenen Tabellen abrufen, und vorerst dauert es etwa 20 Sekunden, um die Seite zu laden, die schrecklich ist.Verstehen von mehreren Tabellen Ergebnis unter Entity Framework

Also ich möchte alles in eine Store-Prozedur zu bewegen und alle diese Informationen die alte DataTable Weg.

ich diese

public WinnerPageInformation FindWinnerPageInformation(int calendarId) 
{ 
    BackendPagesContext ctx = new BackendPagesContext(db.Connection); 
    IMultipleResults results = ctx.WinnersBackendPageInformation(calendarId); 

    return new WinnerPageInformation() 
    { 
     Challenges = results.GetResult<Challenges>(), 
     Content = results.GetResult<ContentWinners>().FirstOrDefault(), 
     Einfo = results.GetResult<ContentEmails>().FirstOrDefault(), 
     Fields = results.GetResult<SubscriberFields>(), 
     Prizes = results.GetResult<Prizes>(), 
     Winners = results.GetResult<Winners>() 
    }; 
} 

und WinnersBackendPageInformation sieht aus wie diese

public class BackendPagesContext : DataContext 
{ 
    public BackendPagesContext(System.Data.IDbConnection connection) 
     : base(connection) { } 

    [Function(Name = "dbo.sp_GetWinnersBackendPageInformation")] 
    [ResultType(typeof(JK_ContentWinners))] 
    [ResultType(typeof(JK_Winners))] 
    [ResultType(typeof(JK_SubscriberFields))] 
    [ResultType(typeof(JK_Prizes))] 
    [ResultType(typeof(JK_Challenges))] 
    [ResultType(typeof(JK_ContentEmails))] 
    public IMultipleResults WinnersBackendPageInformation(
     [Parameter(Name = "calendarId", DbType = "Int")] int calendarId) 
    { 
     IExecuteResult result = 
     this.ExecuteMethodCall(this, 
           ((MethodInfo)(MethodInfo.GetCurrentMethod())), 
           calendarId); 
     return (IMultipleResults)(result.ReturnValue); 
    } 
} 

public interface IMultipleResults : IFunctionResult, IDisposable 
{ 
    IEnumerable<TElement> GetResult<TElement>(); 
} 

aber das Problem, das ich mit Blick auf bin, ist, dass die Linie this.ExecuteMethodCall einen Fehler wirft sagen, dass das Ergebnis nicht ein multiple Ergebnis.

mein Speicher Vorgehensweise sieht aus wie

ALTER PROCEDURE sp_GetWinnersBackendPageInformation 
    @calendarId numeric = 0 
AS 
BEGIN 
    SELECT * FROM ContentWinners WHERE calendar_id = @calendarId; 
    SELECT * FROM Winners WHERE calendar_id = @calendarId; 
    SELECT * FROM SubscriberFields WHERE calendar_id = @calendarId ORDER BY position; 
    SELECT * FROM Prizes WHERE calendar_id = @calendarId ORDER BY prizetype_id, to_day, title; 
    SELECT * FROM Challenges WHERE calendar_id = @calendarId; 
    SELECT * FROM ContentEmails WHERE calendar_id = @calendarId; 
END 
GO 

Fehlermeldung

Mehr als ein Ergebnistyp für die Funktion ‚WinnersBackendPageInformation‘ deklariert ist, die IMultipleResults nicht zurück.

Was fehlt mir?

Antwort

2

Sie verpassen nichts.

Entity Framework 4 unterstützt nicht mehrere Ergebnismengen in gespeicherten Prozeduren.

Wenn Sie die Blog-Post here lesen, werden Sie diese Aussage von einem Mitglied des EF Teams finden:

Leider waren wir die volle Unterstützung für mehrere Ergebnisse in das Produkt dieser Zeit zu bekommen nicht in der Lage um. Wir haben jedoch die Methode Translate to ObjectContext hinzugefügt, mit der Sie Objekte aus einem DataReader materialisieren können. Wenn Sie also eine Stored Procedure haben, die mehrere Ergebnisse zurückgibt, deren Eigenschaften direkt an EF-Objekten ausgerichtet sind, können Sie die zugrunde liegende Speicherverbindung vom Kontext (context.Connection.StoreConnection) abrufen, einen Befehl erstellen und ihn zum Ausführen der gespeicherten Prozedur verwenden hol den DataReader zurück. Dann könnten Sie rufen Übersetzen und eine zählbare dieser Objekte zurück, gefolgt von reader.NextResult() und Übersetzen etc.

So können Sie einige „old-school“ ADO.NET verwenden, alternativ können Sie Versuchen Sie die EF Extensions Projekt auf CodePlex die scheint, die Rohrleitungen für Sie zu tun.

+0

danke für den Hinweis ... kam nie zu diesem Kommentar :( – balexandre

Verwandte Themen