J'essaie d'implémenter une requête dans LINQ qui utilise une jointure externe gauche avec plusieurs conditions dans la clause ON.
J'utiliserai l'exemple des deux tables suivantes: Project (ProjectID, ProjectName) et Task (TaskID, ProjectID, TaskName, Completed). Je veux voir la liste complète de tous les projets avec leurs tâches respectives, mais uniquement les tâches terminées.
Je ne peux pas utiliser de filtre pour Completed == true
car cela filtrera tous les projets qui n'ont pas de tâches terminées. Au lieu de cela, je souhaite ajouter Completed == true
à la clause ON de la jointure afin que la liste complète des projets soit affichée, mais seules les tâches terminées seront affichées. Les projets sans tâche terminée afficheront une seule ligne avec une valeur nulle pour Tâche.
Voici le fondement de la requête.
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
Comment puis-je ajouter && t2.Completed == true
à l'article sur?
Je n'arrive pas à trouver de documentation LINQ sur la façon de procéder.
Réponses:
Il vous suffit de nommer la propriété anonyme de la même manière des deux côtés
Sur la base des commentaires de @svick, voici une autre implémentation qui pourrait avoir plus de sens:
la source
and
, pas une égalité d'un objet «bizarre». Et pour prouver mon point, votre code est faux. Pour que cela fonctionne, il faudrait avoirtrue
du côté gauche et du côtét2.Complete
droit.AND SecondProperty IN (123, 456)
. Je vais passer à ce défi et toute aide que vous pourriez donner serait grandement appréciée.Ici vous allez avec:
la source
Vous ne pouvez pas faire ça comme ça. La
join
clause (et laJoin()
méthode d'extension) ne prend en charge que les équi-jointures. C'est aussi la raison, pourquoi il utiliseequals
et non==
. Et même si vous pouviez faire quelque chose comme ça, cela ne fonctionnerait pas, car iljoin
s'agit d'une jointure interne et non externe.la source
Cela fonctionne bien pour 2 tables. J'ai 3 tables et sur la clause doit lier 2 conditions de 3 tables. Mon code:
from p in _dbContext.Products join pv in _dbContext.ProductVariants on p.ProduktId equals pv.ProduktId join jpr in leftJoinQuery on new {VariantId = pv.Vid, ProductId = p. ProductId = jpr.Prices.ProduktID} dans lj
Mais son erreur d'affichage à ce stade: joindre pv dans _dbContext.ProductVariants sur p.ProduktId est égal à pv.ProduktId
Erreur: le type de l'une des expressions de la clause de jointure est incorrect. L'inférence de type a échoué lors de l'appel à «GroupJoin».
la source