2010-12-06 2 views
1

ich den Code unten haben:Linq kompilierte Abfrage Fehler „parameteres können keine Sequenzen sein“

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

Ich erhalte eine Fehlermeldung „parameteres kann nicht sein Sequenzen“, wenn ich laufen filteredFunc, die seltsam ist, weil "Kapitel" Objekt ist IQueryable, nicht IEnumerable, also warum bekomme ich den Fehler?

Der folgende Code funktioniert gut, aber es ist nicht gut für mich.

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

Welchen Teil davon möchten Sie kompilieren? Es sieht so aus, als ob Sie die Datenbank abfragen, um 'Kapitel 'zu füllen, und dann versuchen, die Ergebnisse an die Datenbank zu übergeben, um distinct zu verwenden. Wissen Sie, in welcher Zeile die gelesene Datenbank tatsächlich vorkommt? Ich vermute, es ist die 'var chapters' Linie und das ist nicht das, was du meintest. Ich habe nur alle CompiledQueries verwendet, um von einem Set aus dem DataContext zu starten, anstatt einen übergebenen Satz zu verwenden. – Rup

+0

versuche, IEnumerable aus deinem IQueriable mithilfe der toList-Funktion zu erstellen. Seien Sie sich bewusst, es wird Datenbankabfrage übergeben – ASpirin

+0

Rup, gibt es eine Sequenz von Abfragen, die miteinander verbunden sind, aktualisierte ich meinen Beitrag mit diesen Abfragen. Es scheint, als ob Sie Recht haben, dass Abfragen nicht an die CompiledQuery übergeben werden sollten, jedenfalls dachte ich, es würde die Zeit für die Auswertung nur einer Abfrage, nicht aller Abfragen verringern, aber es ist merkwürdig, dass wir keine Abfragen weitergeben können. Überprüft meine Fragen. –

Antwort

1

Sie können kompilierte Abfragen mit einem IEnumerable wie diesem nicht verwenden. Die Anzahl der Elemente in der Aufzählung kann variieren, und daher variiert der Abfrageplan für die Abfrage basierend auf seiner Größe. Entfernen Sie einfach die kompilierte Abfrage und verwenden Sie die Funktion wie sie ist.

+0

danke, ich missverstanden den Zweck der kompilierten Abfragen. –

Verwandte Themen