2011-07-11 60 views
3

我需要从allCategories中减去contentCategories的结果,此时我使用.Except方法,但我收到错误消息。EF-无法从System.Linq.IQueryable转换为System.Data.Objects.ObjectQuery

任何想法,我做错了什么......非常感谢

Error 2 Argument 1: cannot convert from 'System.Linq.IQueryable<System.Data.Objects.DataClasses.EntityCollection<WebProject.DataAccess.DatabaseModels.CmsCategory>>' to 'System.Data.Objects.ObjectQuery<WebProject.DataAccess.DatabaseModels.CmsCategory>' 

  int contentId = Int32.Parse(uxContentsListSelector.SelectedValue); 
      var allCategories = from category in context.CmsCategories select category; 
      var contentCategories = from content in context.CmsContents 
              where content.ContentId == contentId 
              select content.CmsCategories; 
      var result = context.CmsCategories.Except(contentCategories); 

回答

3

您需要添加一个额外的from in子句才能得到一个扁平列表。

var contentCategories = from content in context.CmsContents 
         from cat in content.CmsCategories 
         where content.ContentId == contentId 
         select cat; 

然后,我会改变你的Except方法的Any方法

var result = context.CmsCategories.Where(cat => !contentCategories.Any(c => c.CategoryId == cat.CategoryId)); 
+0

这不是他要求的,而你的解决方案不能解决他的问题。检查我的答案是否正确。 –

+0

嗨Aducci我真的很感谢你对此的帮助。你的最后一行代码已经解决了我的问题。 – GibboK

2

这是最后的选择,因为你正在做的。你也是代码高度缩减。让我们把它分步:

var allCategories = from category in context.CmsCategories select category; 

您可以重写同在一个更简洁的方式:

var allCategories = context.CmsCategories; 

那么这是错误的:你选择素的集合,而不是一个单一的集合的查询:

var contentCategories = from content in context.CmsContents 
             where content.ContentId == contentId 
             select content.CmsCategories; 

正确的方式做到这一点是:

var contentCategories = (from content in context.CmsContents 
             where content.ContentId == contentId 
             select content).First().CmsCategories; 

这是再次重复,并能以更好的方式来写:

var contentCategories = context.CmsContents.First(c => c.ContentId == contentId).CmsCategories; 

最后陈述是正确的。

+0

您好,我收到此错误:无法创建类型的常量值“WebProject.DataAccess.DatabaseModels.CmsCategory”。在此上下文中仅支持基本类型(如Int32,String和Guid)。 – GibboK

+0

任何想法如何解决它? – GibboK

+0

正如我以前告诉过你的,你需要提供产生错误的代码,否则我不能帮你。 –

相关问题