0 votes

Réutilisation des expressions de requêtes Linq

Poste édité

Serait-ce possible ?

Avoir une expression de requête précompilée

i.e

private static Func<SmwrDataContext, int, IQueryable<Xyz>> _validXyzs = 
   CompiledQuery.Compile((Context context, int Id) => 
                                from xyz in _db.XYZs 
                                join abc in _db.ABCs on xyz.Id equals abc.Id  
                                where xyz.TypeId = id && xyz.Flag && abc.Flag  
                                select xyz);

J'avais initialement déclaré ceci dans le même référentiel et j'y accédais directement, je n'ai eu aucun problème pour le consommer.

public List<MyItem> GetItemsForValueRange(int xyzTypeId, double floor, double ceiling)
{
    return (from xyx from _validXyzs (_db, xyzTypeId)
            join num from _db.numbers xyz.ID equals num.lettersId
            where 
                 num.Value >= floor && num.Value <= ceiling
                 num.Flag
            select new {
                         Name = xyz.Name, 
                         Value = num.Value
                       }).ToList();
}

Plus tard, j'ai refactorisé la variable statique dans une classe différente, car la même requête était utilisée par plusieurs référentiels,

La déclaration après le remaniement était la suivante (_filteredXyzs) réside dans la même classe que la méthode, ce qui la rend disponible pour la consommation.

Public static IQueryable<Xyz> GetValidXyzs(Context context, int xyzTypeId)
{
   return from _filteredXyzs(context, id);
}

Je l'utilisais après le remaniement en tant que [RepositoryName].GetValidXyzs dans un contexte de requête particulier, mais je me retrouve avec le résultat suivant "System.StackOverflowException' s'est produite dans System.Data.Linq.dll".

L'entité Xyz est basée sur le sommet, sa disponibilité étant déterminée par les drapeaux des autres types dans les tables de base.

Xyz étant consommé dans de nombreux endroits, j'ai précompilé la requête pour une meilleure performance, je voulais juste centraliser cet aspect pour faciliter la maintenance.

Lorsque je passe par le débogueur, les méthodes statiques sortent sans erreur, mais échouent à l'étape suivante, c'est-à-dire à l'assemblage et à l'évaluation. Je suis donc un peu perplexe quant à la manière de résoudre ce problème ?

Je suis désolé pour les fautes de frappe et les déductions incorrectes, car mes connaissances en matière de C# et de Linq sont limitées,

Ps : en passant, Linq2Action recommande un champ statique avec une méthode non statique.

Toute aide serait appréciée

0voto

Jon Skeet Points 692016

À part quelques bizarreries syntaxiques (dans une expression de requête c'est where au lieu de Where et je ne sais pas pourquoi tu as [Id] ) I pensez à ça devrait aller. Certes, je n'ai pas beaucoup d'expérience avec les requêtes compilées, mais cela vaut vraiment le coup d'essayer. LINQ est conçu pour être composable, après tout.

L'avez-vous essayé ? Si vous rencontrez des problèmes, écrivez-les dans la question pour que nous puissions essayer de les résoudre.

EDIT : En réponse à "cela fonctionne lorsqu'il est défini dans la même classe, mais pas lorsqu'il est défini dans une classe externe", il semble que vous essayez toujours de l'appeler comme si c'était étaient dans la même classe. C'est une méthode, appelez-la comme vous le feriez pour n'importe quelle autre méthode - avec le nom du type si c'est une méthode statique, ou via une référence sinon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X