2010-12-06 29 views
1

我有下面的代码:LINQ编译的查询错误“parameteres不能序列”

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

我得到一个错误“parameteres不能序列”当我运行filteredFunc,这是不可思议的,因为“章节”对象是IQueryable,而不是IEnumerable,那么为什么我会得到错误?

下面的代码工作正常,但它对我没有好处。

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

这是你想要编译的部分?看起来您正在查询数据库来填充`章节',然后尝试将后面的结果传递给数据库以使用不同的结果。你知道数据库读取的是哪一行吗?我怀疑这是`var chapters`行,这不是你的意思。我只使用CompiledQueries从一个从DataContext获取的集合开始,而不是使用传入的集合。 – Rup 2010-12-06 13:38:40

+0

尝试使用toList函数从您的IQueriable创建IEnumerable。要知道它会通过数据库查询 – ASpirin 2010-12-06 13:42:04

回答

1

您不能像这样使用IEnumerable编译查询。枚举中的项目数量可能会有所不同,因此查询的查询计划将根据其大小而有所不同。只需删除已编译的查询并按原样使用该函数。