2012-02-29 17 views
13

Ben en iyi LINQ ben ile gelebilir edilir Burada EF4.3İdare Framework için JOIN İşte

 command = database.GetSqlStringCommand(@" 
           select 
            H.AUTHENTICATION_ID, 
            USERNAME, 
            PERMISSIONS, 
            ORGANIZATION_IDENTIFIER, 
            O.ORGANIZATION_ID 
           from 
            AUTHENTICATION H 
             left join [AUTHORIZATION] T on H.AUTHENTICATION_ID=T.AUTHENTICATION_ID 
             join ORGANIZATION O on O.ORGANIZATION_ID = T.ORGANIZATION_ID 
           order by H.AUTHENTICATION_ID"); 

dönüştürmek istediğiniz SQL sorgusu geçerli:

 var query = from h in context.Authentications 
      join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId 
      join o in context.Organizations on t.Organizations.OrganizationId equals o.OrganizationId 
      orderby 
      h.AuthenticationId 
      select new 
      { AUTHENTICATION_ID = (Int16?)h.AuthenticationId, 
       h.Username, 
       t.Permissions, 
       o.OrganizationIdentifier, 
       OrganizationID = (Int16?)o.OrganizationId 
      }; 

I ilk katılımımı (& Kimlik Doğrulamaları arasında) birleştirmem gerektiğini biliyorum, x diyelim ve DefaultIfEmpty'yi uygulayalım ama sözdizimini yapamayız.

DÜZENLEME: açıklama için Resim: Herhangi bir yardım son derece takdir edilecektir Data Model

. Saygılarımızla.

cevap

33

temel sözdizimi bir Linq böyledir içinde "sol katıl":

from x in table1 
join y in table2 on x.id equals y.id into jointable 
from z in jointable.DefaultIfEmpty() 
select new 
{ 
    x.Field1, 
    x.Field2, 
    x.Field3, 
    Field4 = z == null ? 0 : z.Field4 
}; 

taraf ilişkileri size Linq don içinde kullanıyor görünüyor çünkü durumda, biraz kafam karıştı' SQL'iniz tarafından ima edilenleri eşleştirin; burada sıfır-or-bir, sıfır-ya da çok, bire-bir, vb ilişkiler mi?

from h in context.Authentications 
join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId 

ancak SQL "Doğrulama" ebeveyn fazla gibi olurdu sıfır veya-daha "Yetki" Çocuklar, tam tersi değil, burada olduğunu ima: Özellikle, bunu yaptığını:

from h in context.Authentications 
from t in h.Authorizations.DefaultIfEmpty() 

bize veri modelinin daha iyi bir fikir verebilir ve hangi verilerin biz daha kolay bu sorgu Linq nasıl görüneceğini açıklayabilir bunun dışında almak için bekliyorsanız. senin ilişkiler SQL ima eşleşmesi varsayarsak, aşağıdaki Linq sorguları kullanarak istediğiniz şeyi elde etmek mümkün olmalıdır:

devam ettim ve veritabanı üzerinde bir saklı yordam tüm sorguyu taşındı
var query = from h in context.Authentications 
      from t in h.Authorizations.DefaultIfEmpty() 
      select new 
      { 
       h.AuthenticationId, 
       h.Username, 
       Permissions = t == null ? null : t.Permissions, 
       Organizations = t == null ? new EntitySet<Organization>() : t.Organizations 
      }; 

var query2 = from x in query 
      from o in x.organizations.DefaultIfEmpty() 
      select new 
      { 
       AUTHENTICATION_ID = (short?)x.AuthenticationId, 
       x.Username, 
       x.Permissions, 
       OrganizationIdentifier = o == null ? null : o.OrganizationIdentifier, 
       OrganizationID = o == null ? (short?)null : o.OrganizationID 
      }; 
+0

Ayrıntılar için teşekkürler. Soruma bir resim ekledim. Durumumu açıklığa kavuşturup koymadığına bakın. Cevabınız için teşekkürler. Çok takdir edildi. – DoomerDGR8

+1

Bence yayınlanan LINQ çalışacağını düşünüyorum. Size, Kimlik Doğrulama tablosundan, ayrıca bu Kimlik Doğrulama için eşleşen herhangi bir Yetkilendirmeden (varsa) ve bu Kimlik Doğrulamaların eşleşen tüm Kuruluşlarından size her şeyi verecektir. –

+1

İhtiyacınız olabilecek bir küçük güncelleme: yazılı olarak yanıtım, eşleşen bir Kuruluş kaydına sahip olmayan Yetkilendirmeler - bir iç birleştirme yerine ikinci bir sol birleştirme döndürecektir. Veri modelinize bağlı olarak bir olasılık olabilir veya olmayabilir, endişelenmeniz gerekir; bu bir endişe varsa bana bildirin. –

-3

. Bu, LINQ ve ObjectBuilder'ı ilk etapta önleyerek sorunu çözer.

+3

Açıkçası en kötü durum geri dönüşü, yararlı bir cevap değil. –

+0

Benim için iş için doğru aracı kullanmanın açık bir örneği. – Vaiden

+2

Bir çivi tuttuğunuz her şeyi bir çivi gibi gördüğünüzde daha çok benziyor. –