2010-12-22 2 views
4

Pour afficher une page, j'ai besoin d'obtenir beaucoup d'informations de diverses tables, et pour l'instant, cela prend environ 20 secondes pour charger la page, ce qui est terrible.Comprendre le résultat de plusieurs tables sous Entity Framework

Donc, je veux tout déplacer dans une procédure de magasin et obtenir toutes ces informations l'ancienne manière DataTable.

Je reçois ce

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

et WinnersBackendPageInformation ressemble à ceci

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

mais le problème que je suis face est que, la ligne this.ExecuteMethodCall renvoie une erreur indiquant que le résultat est pas un multipletable résultat.

ma procédure de magasin ressemble

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 

message d'erreur est

Plus d'un type de résultat déclaré pour la fonction 'WinnersBackendPageInformation' qui ne revient pas IMultipleResults.

Qu'est-ce qui me manque?

Répondre

2

Vous ne manquez rien. Entity Framework 4 ne prend pas en charge plusieurs ensembles de résultats dans les procédures stockées.

Si vous lisez le blog here, vous trouverez cette déclaration d'un membre de l'équipe EF:

Malheureusement nous n'étions pas en mesure d'obtenir un support complet pour plusieurs résultats dans le produit cette fois-ci autour. Nous avons cependant ajouté la méthode Traduire à ObjectContext qui vous permet de matérialiser des objets à partir d'un DataReader. Ainsi, si vous avez une procédure stockée qui renvoie plusieurs résultats dont les propriétés s'alignent directement sur les objets EF, vous pouvez obtenir la connexion de stockage sous-jacente du contexte (context.Connection.StoreConnection), créer une commande et l'utiliser pour exécuter la procédure stockée. récupère le DataReader. Ensuite, vous pouvez appeler Traduire et récupérer un dénombrable de ces objets, suivi par reader.NextResult() et traduire, etc.

Ainsi, vous pouvez utiliser un peu ADO.NET « old-school », alternativement, vous pouvez essayez le EF Extensions projet sur CodePlex qui semble faire la plomberie pour vous.

+0

merci de le signaler ... jamais arrivé à ce commentaire :( – balexandre

Questions connexes