2009-11-28 20 views
0

Message modifiérequête LINQ expression réutilisation

Serait-ce possible?

ont une expression de requête qui est 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 d'abord déclaré cela dans le même dépôt accédait directement, n'a eu aucun problème à 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 remaniée avec la variable statique dans une classe différente de celle du même requête était comsumed par plusieurs référentiels,

poste de déclaration refactoring était la suivante (_filteredXyzs) se trouve dans la même classe que le procédé rend disponible pour la consommation.

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

dévorait post-it refactoring comme [RepositoryName] .GetValidXyzs dans un contexte de requête particulière, mais finissent par le suivant "System.StackOverflowException » a eu lieu dans System.Data.Linq.dll"

L'entité Xyz est basée sur le sommet, sa disponibilité étant déterminée par les indicateurs d'autres types dans les tables principales. Avec Xyz étant consommé dans de nombreux endroits, j'ai précompilé la requête pour de meilleures performances, je voulais juste centraliser cet aspect pour le rendre plus facile à entretenir.

Lorsque je parcours les méthodes statiques du débogueur, quitte sans erreur, mais échoue lors de la prochaine étape, c'est-à-dire de la jonction et de l'évaluation. donc je suis un peu perplexe sur la façon de résoudre ce problème?

Je suis désolé pour les fautes de frappe & toutes les autres conclusions erronées que ma connaissance wrt C# et LINQ est limitée,

Ps: sur un Linq2Action de sidenote recommande un champ statique avec une méthode non statique

Tous aide serait appréciée

+0

Quelles sont les signatures complètes? Fournissez plus de détails sur la façon dont votre code est organisé dans les classes et méthodes séparées. –

Répondre

0

Autre que quelques bizarreries syntaxe (dans une expression de requête, il est where au lieu de Where, et je ne sais pas pourquoi vous avez [Id]) Je pense qui devrait être d'accord. Certes, je n'ai pas beaucoup d'expérience avec les requêtes compilées, mais ça vaut vraiment le coup. LINQ est conçu pour être composable, après tout.

Avez-vous essayé? Si vous avez des problèmes, éditez-les dans la question afin 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 ne l'est pas lorsqu'il est défini dans un externe" il semble que vous essayez toujours de l'appeler comme si étaient dans la même classe. C'est une méthode, appelez-la comme vous appelez n'importe quelle autre méthode - avec le nom du type si c'est une méthode statique, ou via une référence dans le cas contraire.

+0

désolé pour les fautes de frappe, il fonctionne lorsque les déclarations statiques sont dans la même classe, mais ne le fait pas dans un externe. Existe-t-il un autre moyen de rendre les requêtes plus réutilisables? – kalki