2010-12-06 12 views
1

J'ai le code ci-dessous:LINQ erreur de requête compilé « parameteres ne peut pas être des séquences »

var catRoots = CatalogContext.CatalogRoots.Where(cr => cr.Visible); 
var catChapter = CatalogContext.CatalogChapters.Where(cch => cch.Visible); 
var catThemes = CatalogContext.CatalogThemes.Where(cth => cth.Visible); 
var catCompanies = CatalogContext.CatalogCompanies.Where(cc => cc.Visible); 
var catRelations = CatalogContext.CatalogCompanyThemeRelations.Where(cctr => cctr.Visible && cctr.OwnerVisible); 
var regions = CatalogContext.Regions.AsQueryable(); 

var compChapters = catRelations.Where(cctr => cctr.Location == CatalogCompanyLocations.Chapter) 
      .Join(catChapter, cctr => cctr.ParentID, cch => cch.ID, (cctr, cch) => new { Relation = cctr, Chapter = cch }) 
      .Join(catRoots, cch => cch.Chapter.CatalogRootID, cr => cr.ID, (cch, cr) => new { CatalogRoot = cr, CatalogChapter = cch.Chapter, CatalogRelation = cch.Relation }) 
      .Join(catCompanies, cr => cr.CatalogRelation.CompanyID, cc => cc.ID, (cr, cc) => new { Root = cr.CatalogRoot, Chapter = cr.CatalogChapter, Theme = default(CatalogTheme), Company = cc }) 
      .Join(regions, cc => cc.Company.RegionID, r => r.ID, (cc, r) => new { Root = cc.Root, Chapter = cc.Chapter, Theme = cc.Theme, Company = cc }) 
      .GroupBy(gr => new { Chapter = gr.Chapter, Name = gr.Root.Name, ID = gr.Root.ID, Icon = gr.Root.Icon, Rewrite = gr.Root.Rewrite, Sort = gr.Root.Sort }) 
      .Select(gr => new { Chapter = gr.Key.Chapter, ID = gr.Key.ID, Name = gr.Key.Name, Icon = gr.Key.Icon, Rewrite = gr.Key.Rewrite, Sort = gr.Key.Sort, Count = gr.Count() }); 

var compThemes = catRelations.Where(cctr => cctr.Location == CatalogCompanyLocations.Theme) 
      .Join(catThemes, cctr => cctr.ParentID, cth => cth.ID, (cctr, cth) => new { Relation = cctr, Theme = cth }) 
      .Join(catChapter, cth => cth.Theme.CatalogChapterID, cch => cch.ID, (cth, cch) => new { Relation = cth.Relation, Theme = cth.Theme, Chapter = cch }) 
      .Join(catRoots, cch => cch.Chapter.CatalogRootID, cr => cr.ID, (cch, cr) => new { Relation = cch.Relation, Theme = cch.Theme, Chapter = cch.Chapter, Root = cr }) 
      .Join(catCompanies, cr => cr.Relation.CompanyID, cc => cc.ID, (cr, cc) => new { Root = cr.Root, Chapter = cr.Chapter, Theme = cr.Theme, Company = cc }) 
      .Join(regions, cc => cc.Company.RegionID, r => r.ID, (cc, r) => new { Root = cc.Root, Chapter = cc.Chapter, Theme = cc.Theme, Company = cc.Company }) 
      .GroupBy(gr => new { Chapter = gr.Chapter, Name = gr.Root.Name, ID = gr.Root.ID, Icon = gr.Root.Icon, Rewrite = gr.Root.Rewrite, Sort = gr.Root.Sort }) 
      .Select(gr => new { Chapter = gr.Key.Chapter, ID = gr.Key.ID, Name = gr.Key.Name, Icon = gr.Key.Icon, Rewrite = gr.Key.Rewrite, Sort = gr.Key.Sort, Count = gr.Count() }); 

var source = compChapters.Union(compThemes); 

var chapters = source.Select(r => new { Chapter = r.Chapter, Count = r.Count }).Cast<object>().Distinct(); 

public static Func<DataContext, IQueryable<object>, IEnumerable<object>> filteredFunc = 
CompiledQuery.Compile<DataContext, IQueryable<object>, IEnumerable<object>> 
(
     (DataContext db, IQueryable<object> q) => q.Distinct().ToList() 
); 

filtredChapters = filteredFunc(CatalogContext, chapters); 

Je reçois une erreur « parameteres ne peuvent pas être des séquences » quand je lance filteredFunc, ce qui est étrange, parce que L'objet "chapters" est IQueryable, pas IEnumerable, alors pourquoi ai-je l'erreur?

Le code ci-dessous fonctionne bien, mais ce n'est pas bon pour moi.

filtredChapters = chapters.Distinct().Cast<object>().ToList(); 
+1

Dans quelle partie tentez-vous de compiler? Il semble que vous interrogiez la base de données pour peupler les «chapitres», puis essayez de transmettre les résultats de cette opération à la base de données pour utiliser distinct. Savez-vous quelle ligne la base de données lue se produit réellement? Je pense que c'est la ligne 'var chapitres 'et ce n'est pas ce que vous vouliez dire. Je n'ai utilisé que CompiledQueries pour commencer à partir d'un ensemble provenant du DataContext plutôt que d'utiliser un ensemble passé. – Rup

+0

essayez de créer IEnumerable à partir de votre IQueriable en utilisant la fonction toList. Sachez qu'il passera la requête de base de données – ASpirin

+0

Rup, il y a une séquence de requêtes qui sont jointes entre eux, j'ai mis à jour mon message avec ces requêtes. Il semble que vous ayez raison que les requêtes ne soient pas transmises à CompiledQuery, de toute façon je pensais que cela diminuerait le temps pour évaluer seulement une requête, pas toutes les requêtes, mais il est étrange que nous ne puissions pas passer de requêtes. Reverra mes questions. –

Répondre

1

Vous ne pouvez pas utiliser les requêtes compilées avec un IEnumerable comme ceci. Le nombre d'éléments dans l'énumération peut varier et le plan de requête de la requête variera en fonction de sa taille. Supprimez simplement la requête compilée et utilisez la fonction telle quelle.

+0

merci, j'ai mal compris le but des requêtes compilées. –