J'ai deux tables:Comment faire une jointure de table sur deux champs dans ma deuxième table?
- Messages - Entre autres choses, a un to_id et un from_id terrain.
- personnes - a un correspondant person_id
J'essaie de comprendre comment faire ce qui suit dans un seul LINQ requête:
Donnez-moi tous les messages qui ont été envoyés et à partir de la personne x (idself).
J'ai eu quelques fissures à ce sujet.
Pas tout à fait
MsgPeople = (from p in db.people
join m in db.messages on p.person_id equals m.from_id
where (m.from_id == idself || m.to_id == idself)
orderby p.name descending
select p).Distinct();
Cela fonctionne presque, sauf que je pense qu'il manque un cas:
"Les gens qui ont jamais reçu un message, envoyé pour me"
Comment cela fonctionne dans ma tête
Alors ce que je vraiment besoin est quelque chose comme:
join m in db.messages on (p.people_id equals m.from_id or p.people_id equals m.to_id)
me fait un sous-ensemble des personnes que je suis après
Il semble que vous ne pouvez pas faire cela. Je l'ai essayé quelques autres options, comme faire deux jointures:
MsgPeople = (from p in db.people
join m in db.messages on p.person_id equals m.from_id
join m2 in db.messages on p.person_id equals m2.to_id
where (m2.from_id == idself || m.to_id == idself)
orderby p.name descending
select p).Distinct();
mais cela me donne un sous-ensemble des résultats dont j'ai besoin, je suppose que quelque chose à faire avec l'ordre les jointures sont résolues.
Ma compréhension de LINQ (et peut-être même de la théorie des bases de données) est embarrassante superficielle et j'ai hâte d'avoir un peu de lumière sur mon problème.
J'ai évité cela car cela pourrait causer des échecs, l'association ne peut être que sur un champ, donc disons que vous choisissez to_id, si la personne dans idself n'a pas envoyé un email il manquera en tant que SQL cela génère serait SELECT [t0]. [person_id] de [personnes] AS [t0] OÙ EXISTE ( SELECT NULL AS [EMPTY] de [messages] AS [t1] OÙ (([t1]. [to_id] = @ p0) OU ([t1]. [from_id] = @ p1)) AND ([t1]. [to_id] = [t0].[Person_id]) ) Je pense que – Pharabus
J'ai manqué le fait qu'il existe plusieurs relations entre les gens et les messages. Fixé! –
ouais cela fonctionne +1 de moi pour utiliser les relations :) aussi j'ai découvert que LINQPad nomme joliment les associations pour moi aussi! – Pharabus