Операторы сравнения не поддерживаются для типа 'System.Linq.IQueryable`1 [System.Int32]' - PullRequest
1 голос
/ 05 августа 2009

Я столкнулся с проблемой с LTS Мой код, как показано ниже:

return from p in _db.Companies
where p.Deleted == false &&
(from q in _db.Contacts_Companies
where q.ContactId == contactId && q.Deleted == false
select q.CompanyId).Equals(p.Id)
select p;

Я знаю, что проблема исходит от CompanyId.Equals (Id) они оба Int32, но меня немного смущает, что Int32 нельзя сравнивать? Если я использую Содержит , это не будет соответствовать моим требованиям.

Как я мог преодолеть эту проблему?

Ответы [ 2 ]

1 голос
/ 05 августа 2009

Проблема связана с вашим подзапросом:

from q in _db.Contacts_Companies
where q.ContactId == contactId && q.Deleted == false
select q.CompanyId

Это не возвращает int - оно возвращает (как показано в вашем сообщении об ошибке) IQueryable<int>.

Возможно, вы освоились с семантикой отложенного выполнения linq?

В любом случае, для решения этой проблемы вам необходимо преобразовать IQueryable<int> в простой int. Поскольку вы всегда ожидаете ровно одного результата, я бы предложил добавить .First():

return from p in _db.Companies
where p.Deleted == false &&
(from q in _db.Contacts_Companies
where q.ContactId == contactId && q.Deleted == false
select q.CompanyId).First().Equals(p.Id)
select p;
1 голос
/ 05 августа 2009

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

Попробуйте выбрать только первый элемент:

return from p in _db.Companies 
       where !p.Deleted && (
           from q in _db.Contacts_Companies 
           where q.ContactId == contactId && !q.Deleted 
           select q.CompanyId).FirstOrDefault() == p.Id
       select p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...