2017-07-17 1 views
0

Comment puis-je convertir la déclaration ci-dessous SQL à LINQ:Convertir SQL à LINQ pour la gauche se joindre à NULL en droit

SELECT A.Application, B.Filter 
FROM Applications A left join Filters B on A.Application = B.Filter OR 
B.Filter is null 

J'ai écrit ce qui suit, mais je suis incapable de comprendre comment ajouter « OU B. le filtre est NULL » à elle:

var filteredApproved = (from f in 
(from a in Applications 
join b in Filters on a.Application equals b.Filter into rss 
from ss in rss.DefaultIfEmpty() 
select new { 
a.Application, 
Filter = (b == null ? 0: b.Filter) 
}) 

Par exemple, si les applications et table de filtre sont les suivantes:

Application 
--------- 
A 
B 

Filter 
-------- 
A 
null 

I je suis vouloir le résultat suivant

Application Filter 
---------  ------ 
A    A 
A    null 
B    null 

retourne la requête Linq:

Application Filter 
---------  ------ 
A    A 
B    null 

Il ne retourne pas la deuxième ligne que SQL retourne. Je dois ajouter "OU B.Filter est NULL" à linq.

+0

Comment sont vos objets définis, et quelles relations avez-vous entre eux? – krillgar

+2

Donc vous voulez une jointure externe gauche dans LINQ (et vous auriez pu l'utiliser en SQL!) Cela en fait une copie exacte de [cette question] (https://stackoverflow.com/questions/3404975/left-outer-join -in-linq) – oerkelens

+0

Par exemple, si les applications et table de filtre sont les suivantes: application --------- A B Filtre -------- A null Je veux le résultat suivant application Filtre --------- ------ A \t A A null B null – Sanjeev

Répondre

2

LINQ prend en charge uniquement equijoins. La seule option pour un autre type de joint est la corrélation where (le where régulier avec accès aux propriétés état des deux séquences apparentées), ou en cas de left outer join - une sous-requête corrélative:

var result = 
    from a in Applications 
    from b in Filters 
     .Where(b => a.Application == b.Filter || b.Filter == null) 
     .DefaultIfEmpty() 
    select new 
    { 
     a.Application, 
     Filter = b == null ? null : b.Filter 
    };