У меня есть компания таблицы, которая содержит company_id, company_name и другие детали. У меня есть таблица субдоговоры, который имеет company_id столбец, который отображается на компанию company_id.
Как я могу записать избранный оператор для получения всех активных компаний, которые не были присвоены активному субдоговору? IE company_id не может быть найден в субдоговорах company_id
****** РЕДАКТИРОВАНИЕ *****
Я полагаю, что корректный sql:
select company_id
from company
where company.active_status = 1
and not exists( select * from subcontracts
where subcontracts.company = company.company_id
AND subcontracts.active_status = 1
)
Подвыбор в LINQ практически такой же.
var noSubs = from company in context.Companies
where company.active_status == 1 &&
!(from subcontract in context.Subcontracts
where subcontract.active_status == 1
select subcontract.company_id).Contains(company.company_id)
select company;
Linq to SQL переведет это как «не существует» в таблице субподряда.
Придумайте, как это сделать в стандартном SQL, а затем возьмите копию Linqer ( http://www.sqltolinq.com/ ). Этот продукт преобразует практически любой оператор SQL в запрос LINQ. Это не бесплатно, но и не дорого, и поставляется с 30-дневным пробным периодом. Я нашел это чрезвычайно полезным.
Я не тестировал его, и вполне возможно, что LINQ to SQL не может преобразовать запрос, но теоретически это должно работать.
var result = context
.Subcontracts
.Select(subcontract => new
{
Subcontract = subcontract,
NotAssignedCompanies = context
.Companies
.Where(company => !company.Subcontracts.Contains(subcontract))
});
Это вернет все неназначенные компании по всем субподрядам. Если вам нужна информация только по одному конкретному субподряду, следующего запроса будет достаточно.
var notAssignedCompanies = context
.Companies
.Where(company => !company.Subcontracts.Contains(specificSubcontract));
Похоже, что вы пытаетесь сделать WHERE NOT IN, например:
var companiesWithoutSubcontracts =
from noSub in Companies
where !(from withSub in Companies
select withSub.company_id)
.Contains(noSub.company_id)
select noSub;
`
Это должно работать:
var noContracts =
from c in db.Companies
join sc in db.Subcontracts.Where(sc => sc.active_status == 1) on c.company_id equals sc.company_id into compGroup
from cg in compGroup.DefaultIfEmpty()
where cg.company_id == null
select c;
Выполняется LEFT OUTER JOIN
. Всем субподрядам без соответствующего company_id будет присвоено значение NULL
для company_id, которое затем будет выбрано.