我有两张桌子:
我试图找出如何在单个 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(甚至数据库理论)的理解是令人尴尬的肤浅,我期待着对我的问题有所了解。
答案 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