2010-05-10 18 views
6

Bu sorguyu yazmak için şirket_id, company_name ve diğer ayrıntıları tutan bir masa şirketim var. Şirket.company_id ile eşleşen bir company_id sütunu olan bir tablo alt sözleşmeleri var.Linq2Sql

Etkin bir alt sözleşmeye atanmamış tüm aktif şirketleri almak için nasıl bir deyim yazabilirim? IE company_id

****** DÜZENLEME *****

Doğru sql olduğuna inanıyoruz subcontracts.company_id içinde bulunamaz: yapardın nasıl

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

ben gibi SQL yazarsınız: SOL DIŞ JOIN c şirketin GELEN SEÇ company_id alt sözleşmeler sc = 1 VE sc.active_status sc.company_id geçersiz 1 c.company_id = sc.company_id VE c.active_status = ON NEREDE – Nick

cevap

2

Alt seçim LINQ'da hemen hemen aynıdır.

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 bunu alt sözleşme tablosunda "var olmayan" olarak çevirecektir.

1

Şekil dışarı Bu standart SQL'de ve sonra Linqer (http://www.sqltolinq.com/) bir kopyasını almak. Bu ürün neredeyse tüm SQL deyimlerini bir LINQ sorgusuna dönüştürecektir. Ücretsiz değil, ama pahalı değil ve 30 günlük deneme süresiyle geliyor. Son derece faydalı olduğunu buldum.

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

`

1

belki gibi DEĞİL İÇİNDE bir WHERE yapmaya çalışıyoruz gibi geliyor ama teoride bu işe yarayacak.

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

Bu, tüm alt yüklenicilere tüm belirlenmemiş şirketleri dönecektir. Yalnızca belirli bir alt sözleşme için bilgiye ihtiyacınız varsa, aşağıdaki sorgu yeterli olacaktır.

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

bunu test etmedim ve iyi LINQ to SQL sorgusu çevirmek başarısız olabilir:

1

Bu çalışması gerekir:

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; 

Bu LEFT OUTER JOIN yapar. İlgili bir company_id içermeyen tüm taşeronlara, daha sonra seçtiği company_id için bir NULL değeri atanacaktır.

+0

Teşekkürler. Subcontracts.company_id içinde olmayan active_status == 1 olan şirketleri seçtiği yeri bulabilirim. Ancak, bunun yalnızca active_status ile alt sözleşmelerle eşleştiği yerde çalışacak gibi görünmüyor == 1. Nerede bir araya getirebilirim? – RememberME

+0

@RememberME İstediğinizi yapmak için düzenlenmiş. Bu, aynı zamanda, inaktif – Nick

+0

olan taşeron şirketlere de geri dönüş yapacak. LINQ to SQL, nerede bir fıkra hükmünde bir alt-seçimi ele alabiliyor. –