2010-11-01 27 views
18

Gerçekten böyle bir şey yapmak istiyorum:LINQ'da Varlıklar için SQL "Var Olan Varlıklar" nasıl yapılır?

Select * 
from A join B on A.key = B.key join C on B.key = C.key -- propagated keys 
where exists (select null from B where A.key = B.key and B.Name = "Joe") and 
     exists (select null from C where B.key = C.key and C.Name = "Kim") 

linq deyimi Varlık Çerçeve 4 ve C# kullanarak nasıl olur?

Güncelleme:

Görünüşe .Contains() üretecek sonuçlar "Nerede Var". Yani, başka bir girişim
(bu hatta LOL derlemek eğer ben bilmiyorum):

var inner1 = from recordB in B 
      where recordB.Name = "Joe" 
      select recordB.key; 

var inner2 = from recordC in C 
      where recordC.Name = "Kim" 
      select recordC.key; 

var result = from recordA in A 
      where inner1.Contains(recordA.key) && 
        inner2.Contains(recordA.key) 
      select recordA; 

DÜZENLEME:

:

var result = from A in Products 
      where A.kfield1 == 1 && A.kfield2 == 2 && 
        (from B in Btable 
        where B.otherid == "Joe" && // field I want to select by 
          B.kfield1 == A.kfield1 &&  
          B.kfield2 == A.kfield2 // Can keep adding keys here 
        select A.identifier // unique identity field 
        ).Contains(A.identifier) && 
        (from C in Ctable 
        where C.otherid == "Kim" && // field I want to select by 
          C.kfield1 == A.kfield1 &&  
          C.kfield2 == A.kfield2 // Can keep adding keys here 
        select A.identifier // unique identity field 
        ).Contains(A.identifier) 
      select A; 

Bu, bu SQL üretti: WOW bu aslında çalışmış nedir

SELECT [t0].[identifier], [t0].* 
FROM [A] AS [t0] 
WHERE ([t0].[kfield1] = @p0) AND ([t0].[kfield2] = @p1) AND (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [B] AS [t1] 
    WHERE ([t0].[identifier] = [t0].[identifier]) AND ([t1].[otherid] = @p2) AND 
      ([t1].[kfield1] = [t0].[kfield1]) AND 
      ([t1].[kfield2] = [t0].[kfield2]))) AND (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [C] AS [t2] 
    WHERE ([t0].[identifier] = [t0].[identifier]) AND ([t2].[otherid] = @p3) AND 
      ([t2].[kfield1] = [t0].[kfield1]) AND 
      ([t2].[kfiekd2] = [t0].[kfield2]))) 

İstediğim şey budur. [T0] dikkat edin. [Identifier] = [t0]. [Tanıtıcı] null (SQL) kendisi dahil herhangi bir şey eşit karşılaştırmak değil çünkü boş değerler filtreleyen

cevap

26

.Any() uzantı yöntemi genellikle exists ile eşleşir.

+0

eşittir. Şimdiye kadar internette bulduğum tek şey, SO cevaplarının dışında .Contains() oldu. Gördüm. Her neyse() kullanılmış ama iki ve ikiyi bir araya getirmedim. –

+0

Bu soru, bunu yapmak için bana kod gösteren sona erdi: http://stackoverflow.com/questions/4084102/how-would-i-improve-this-7-line-linq-query-that-acts-as-a- Şartname –

0

Size exists klima ekleyerek denediniz senin katılımın mı?

from a in context.AEntity 
Join B in context.BEntity on A.Key equals B.Key && B.Name == "Joe" 
Join C in context.CEntity on B.Key equals C.Key && C.Name == "Kim"; 

Bu durumun işe yarayıp yaramayacağından emin değilsiniz.

+0

Hayır, o işe yaramaz. 'On' Madde sadece ben ilk etapta' exists' kullandığınız anlıyorum emin değilim, yine sorunuza baktığımızda bir 'equals' ifadesini –

+0

kabul eder. Niçin '' B.Name == '' Joe '&& C.Name == 'Kim' '' yi ekleyelim? –

+0

İç içe geçmiş sonuçları olan varolan bir sorguyu filtrelemeye çalıştığım için. Yuvalanmış parçaya göre filtrelenmem gerekiyor. Bunu yapmayı düşünebilmemin tek yolu bir Var olanı kullanmaktır (eğer bu doğruysa, kaydı alın). –

İlgili konular