Entity Framework Linq IQueryable не содержит определения для Contains - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующий (рабочий) запрос

return _context.SubCategories
            .Join(_context.CategoryLinks,
             sc => sc.ID,
             cl => cl.SubCategoryID,
             (sc, cl) => new { SubCategory = sc, CategoryLinks = cl })
             .Where(x => x.CategoryLinks.CategoryID != CategoryID)
             .Select(x => x.SubCategory).Distinct();

Но моя проблема в том, что в итоге он вернет двойные записи, так как подкатегория может быть связана с несколькими категориями.

То есть мы получаем подкатегории, связанные с категорией Cat_1. Sub_A связан с Cat_1, но также и с Cat_2, запрос отфильтрует Sub_A из результата, поскольку он связан с Cat_1 в таблице CategoryLink. Но в конце концов Sub_A will по-прежнему будет частью resultset, так как он также связан с Cat_2

Поэтому я подумал, что если я сначала получу подкатегории (см. Код ниже), а затем отфильтрую те, которые уже использовались с содержимым, могут решить мою проблему.

var test = _context.CategoryLinks.Where(x => x.CategoryID == CategoryID);

IQueryable<DM.SubCategory> aaa = _context.SubCategories
          .Join(_context.CategoryLinks,
          sc => sc.ID,
          cl => cl.SubCategoryID,
          (sc, cl) => new { SubCategory = sc, CategoryLinks = cl })
          .Where(x => x.CategoryLinks.CategoryID != CategoryID && !test.Contains(x.SubCategory.ID))
          .Select(x => x.SubCategory);

Однако при попытке сделать test.Contains я получаю сообщение об ошибке; IQueryable<CategoryLink> не содержит определения для Contains, а для лучшей перегрузки метода расширения ParallelEnumerable.Contains<Guid>(ParallelQuery<Guid>, Guid) требуется приемник типа ParallelQuery<Guid>

Почему он не позволяет мне использовать содержимое в приведенном выше запросе? Я попытался заменить var test на IQueryable< DM.CategoryLink> test, но это не имело значения.

1 Ответ

4 голосов
/ 03 апреля 2020

IQueryable<T>.Contains имеет два перегруженных метода, и оба не принимают произвольный тип. Если вы хотите проверить, есть ли элемент в коллекции, используйте IQueryable<T>.Any.

Из вашего фрагмента кода, я думаю, это может быть test.Any(t => t.ID == t.Subcategory.ID)

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