Как записать этот запрос в Linq2Sql

У меня есть компания таблицы, которая содержит 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
              )
6
задан Suhaib Janjua 10 February 2014 в 07:51
поделиться

5 ответов

Подвыбор в 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 переведет это как «не существует» в таблице субподряда.

2
ответ дан 17 December 2019 в 04:43
поделиться

Придумайте, как это сделать в стандартном SQL, а затем возьмите копию Linqer ( http://www.sqltolinq.com/ ). Этот продукт преобразует практически любой оператор SQL в запрос LINQ. Это не бесплатно, но и не дорого, и поставляется с 30-дневным пробным периодом. Я нашел это чрезвычайно полезным.

1
ответ дан 17 December 2019 в 04:43
поделиться

Я не тестировал его, и вполне возможно, что 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));
0
ответ дан 17 December 2019 в 04:43
поделиться

Похоже, что вы пытаетесь сделать WHERE NOT IN, например:

var companiesWithoutSubcontracts = 
        from noSub in Companies
        where !(from withSub in Companies
                select withSub.company_id)
               .Contains(noSub.company_id)
        select noSub;

`

1
ответ дан 17 December 2019 в 04:43
поделиться

Это должно работать:

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, которое затем будет выбрано.

1
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: