2010-05-10 20 views
6

Tengo una compañía de tablas que contiene el company_id, company_name y otros detalles. Tengo una tabla de subcontratos que tiene una columna company_id que se asigna a company.company_id.Cómo escribir esta consulta en Linq2Sql

¿Cómo puedo escribir una declaración de selección para obtener todas las compañías activas que no han sido asignadas a un subcontrato activo? Es decir, el Company_id no se puede encontrar en subcontracts.company_id

****** ***** EDITAR

creo que el SQL es correcta:

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 
      ) 
+0

que iba a escribir el código SQL como: Company_id SELECT empresa c LEFT OUTER JOIN subcontratos sc EN c.company_id = sc.company_id Y c.active_status = 1 y = 1 sc.active_status DONDE sc.company_id es nulo – Nick

Respuesta

2

La sub-selección es prácticamente la misma en 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 traducirá esto como "no existe" en la tabla de subcontratación.

1

averiguar cómo se haría esto en SQL estándar y luego recoger una copia de Linqer (http://www.sqltolinq.com/). Este producto convertirá casi cualquier declaración SQL en una consulta LINQ. No es gratis, pero tampoco es caro, y viene con un período de prueba de 30 días. Lo he encontrado extremadamente útil.

1

suena como usted está tratando de hacer una DONDE NO EN, como podría ser:

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

`

0

Yo no lo he probado y es muy posible que LINQ a SQL no se traduce la consulta , pero en teoría esto debería funcionar.

var result = context 
    .Subcontracts 
    .Select(subcontract => new 
     { 
     Subcontract = subcontract, 
     NotAssignedCompanies = context 
      .Companies 
      .Where(company => !company.Subcontracts.Contains(subcontract)) 
     }); 

Esto devolverá todas las empresas no asignadas para todos los subcontratos. Si solo necesita la información para un subcontrato específico, la siguiente consulta será suficiente.

var notAssignedCompanies = context 
    .Companies 
    .Where(company => !company.Subcontracts.Contains(specificSubcontract)); 
1

Esto debería funcionar:

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; 

Esto hace un LEFT OUTER JOIN. A todos los subcontratos sin un company_id correspondiente se les asignará un valor NULL para company_id, que luego seleccionará.

+0

Gracias. Puedo obtenerlo en donde está seleccionando compañías con active_status == 1 que no están en subcontracts.company_id. Pero parece que no puedo hacer que funcione cuando solo coincide con subcontratos con active_status == 1. ¿Dónde coloco el lugar en la unión? – RememberME

+0

@RememberME Editado para hacer lo que yo creo que usted desea. Esto también devolverá empresas con subcontratos que están inactivos – Nick

+0

Realmente no necesita la unión. LINQ to SQL es perfectamente capaz de manejar una sub-selección en la cláusula where. –

Cuestiones relacionadas