Как написать этот запрос в Linq2Sql - PullRequest
6 голосов
/ 10 мая 2010

У меня есть таблица company, в которой хранятся company_id, company_name и другие данные. У меня есть таблица субподрядов, в которой есть столбец company_id, который сопоставлен с company.company_id.

Как я могу написать оператор выбора, чтобы получить все активные компании, которые не были назначены для активного субконтракта? IE Company_id не может быть найден в subcontracts.company_id

****** ****** EDIT 1005 *

Я считаю, что правильный 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
              )

Ответы [ 5 ]

2 голосов
/ 11 мая 2010

В 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 переведет это как "не существует" в таблицу субконтрактов.

1 голос
/ 11 мая 2010

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

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 голос
/ 11 мая 2010

Похоже, что вы пытаетесь сделать ГДЕ НЕ В, как, возможно,:

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

`

1 голос
/ 11 мая 2010

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

0 голосов
/ 11 мая 2010

Я не проверял его, и вполне может быть, что 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...