如何在第二个表中的两个字段上进行表连接?

时间:2010-05-27 23:57:41

标签: linq linq-to-sql

我有两张桌子:

  • 消息 - 除其他外,还有 to_id from_id 字段。
  • 人物 - 具有相应的 person_id

我试图找出如何在单个 linq 查询中执行以下操作:

向我提供所有已发送至x人( idself )的消息。

我有几个裂缝。

不太正确

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();

这几乎有效,除了我认为它错过了一个案例:

“从未收到过短信的人,只是发给我一个人”

这是如何工作的

所以我真正需要的是:

join m in db.messages on (p.people_id equals m.from_id or p.people_id equals m.to_id)

让我成为我所追求的人的一部分

看来你不能这样做。我尝试过其他一些选择,比如 做两个连接:

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();

但是这给了我一些我需要的结果,我猜想要做些什么 处理联接的顺序。

我对LINQ(甚至数据库理论)的理解是令人尴尬的肤浅,我期待着对我的问题有所了解。

3 个答案:

答案 0 :(得分:2)

向自己发送消息或从自己收到消息的人。

from p in People
where p.SentMessages.Any(m => m.to_id == idself)
  || p.ReceivedMessages.Any(m => m.from_id == idself)
select p;

如果您的人员没有这些消息属性create the associations


如果你想拔牙......这是没有关联的相同查询。

IQueryable<int> sentQuery = 
  from sent in Messages
  where sent.to_id = idself
  select sent.from_id;

IQueryable<int> receivedQuery =
  from received in Messages
  where received.from_id = idself
  select received.to_id

IQueryble<People> result =
  from p in people
  where System.Linq.Queryable.Concat(receivedQuery, sentQuery)
    .Any(id => id == p.personId)
  select p;

答案 1 :(得分:1)

也许我错过了一些东西,但似乎你不需要加入,你说“给我所有发送给人x(自己)的消息。”因此,如果你只想要消息,你可以只使用消息表,因为id(idself)是已知的

var MsgPeople from p in AllMessages
                   where p.from_id == idself || p.to_id == idself
                   select p;

好的,试试这个,你真的需要一个id列表给发送给你消息的人,以及一个收到你的消息的列表,然后你可以从People中选择那个列表中存在的任何人

var MsgPeople = from p in db.people
                        where (from m in db.messages
                               where m.from_id == selfid
                               select m.to_id).Union(
                        from m in db.messages
                        where m.to_id == selfid
                        select m.from_id).Contains(p.person_id)
                        select p;

另一种方法,当我向他提出问题时,我从DBA的逆向工程SQL中得到了一个

 var MsgPeople =  from p in Peoples
     where  p.Person_id != selfid &&
    (from m in Messages
    where m.To_id == selfid select m.From_id).Union(
    from m in Messages
    where m.From_id == selfid select m.To_id).Contains(p.Person_id)
    select p;

答案 2 :(得分:0)

也许尝试一个联盟

select all the messages sent by user received by me
union 
select all the messages received by user sent by me