EF - невозможно преобразовать из System.Linq.IQueryable в System.Data.Objects.ObjectQuery - PullRequest
3 голосов
/ 11 июля 2011

Мне нужно вычесть результат contentCategories из allCategories, в тот момент, когда я использую метод .Except, но я получаю ошибку.

Любая идея, что я делаю неправильно ... большое спасибо

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

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Вам нужно добавить дополнительное предложение 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));
2 голосов
/ 11 июля 2011

Это из-за последнего выбора, который вы делаете. Также ваш код сильно избыточен. Давайте рассмотрим это по шагам:

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;

Последнее утверждение верно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...