2010-04-10 6 views
0

J'ai les tables SQL suivantes.Linq2Sql Comment écrire une requête de jointure externe?

ImportantMessages

impID

message

ImportantMessageUsers

imuID

imuUserID

imuImpID

Je veux écrire une requête Linq2Sql afin qu'il retourne toutes les lignes de ImportantMessages qui ne disposent pas d'un record en ImportantMessagesUsers.

champs Matchiing sont impID ----- imuImpID

Supposons imuUserID de 6

Répondre

2

Il serait tout aussi simple que

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Count() == 0); 

EDIT

Je pense J'ai bien compris le problème, vous devez obtenir tous les messages de la table ImportantMessages sans aucun w dans la table ImportantMessageUsers, qui est connectée avec une clé étrangère ImportantMessagesUsers.imuImpID = ImportantMessages.impID. Veuillez vérifier si vous avez une clé étrangère entre ces tables, puis supprimez ces tables du concepteur de contexte Linq et ajoutez-les à nouveau - la clé étrangère doit être visible entre elles créant ainsi des propriétés telles que ImportantMessages.ImportantMessageUsers qui est comme IEnumerable de ImportantMessageUser de type permettant d'utiliser des expressions comme x.ImportantMessageUsers.Count() == 0.

EDIT2

Lorsque l'utilisateur Id doit être filtrée, cette expression lambda devrait faire l'affaire:

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Where(y => y.imuUserID == 6).Count() == 0); 

L'utilisation de lambda sur la notation LINQ est seulement une question de préférence, mais quand plusieurs jointures ne sont pas nécessaires, lambda est généralement plus intuitif à utiliser.

+0

Comment cela fonctionne-t-il? Aucun critère d'utilisateur ajouté? – Malcolm

+0

Je ne pense pas que vous comprenez la question. – Malcolm

+0

Je pense que cette réponse est correcte ... Elle renvoie toutes les lignes dans leur contexte.ImportantMessages que le nombre de lignes liées dans importantMessageUsers est 0. Mais cela ne fonctionne que s'il existe une clé étrangère de importantMessageUsers à importantMessages. (vous devriez avoir ce FK) – Jonathan

1

Vérifiez DefaultIfEmpty().

Voici un exemple d'un de mes anciens SO questions:

LINQ to SQL - How to add a where clause to a left join?

var z = 
    from im in importantMessages 
    join imu in importantMessageUsers 
     on new { im.impID, imuUserID = 7 } equals 
     new { imu.imuImpID, imu.imuUserID } 
    into imJoin 
    from ij in imJoin.DefaultIfEmpty() 
    where ij.imuImpID == null 
    select new 
    { 
     im.Message 
     ... 
+0

Mon problème est même après avoir lu de la documentation que je ne peux pas résoudre? – Malcolm

+0

Vous n'avez pas pris en compte l'ID utilisateur. – Malcolm

+0

J'ai ajouté un échantillon. Avez-vous LinqPad? Beaucoup plus facile à travailler en l'utilisant comme un bloc-notes. Il y a une version gratuite. – Steve

1

C'est ce qui a fonctionné pour moi.

var qry = from imp in ImportantMessages 
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID) 
select imp; 
Questions connexes