Как сделать объединение таблиц в двух полях моей второй таблицы? - PullRequest
1 голос
/ 28 мая 2010

У меня есть две таблицы:

  • Сообщения - среди прочего, имеет 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 ]

2 голосов
/ 28 мая 2010

Люди, которые отправляли сообщения себе или получали сообщения от себя.

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

Если у ваших сотрудников нет этих свойств Сообщений, создает ассоциации .


Если вы хотите вырвать зубы ... вот тот же запрос без ассоциаций.

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 голос
/ 28 мая 2010

может быть, я что-то упускаю, но, кажется, вам не нужно объединение, вы говорите: «Дайте мне все сообщения, которые были отправлены человеку x (идентифицирующему себя»). так что если вам нужны сообщения, вы можете работать только из таблицы сообщений, так как идентификатор (idself) известен

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

хорошо, попробуйте это, вам действительно нужен список идентификаторов для людей, которые отправляли вам сообщения, и список тех, кто получил сообщения от вас, затем вы можете выбрать из Людей любых людей, которые существуют в этом списке

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;

еще один способ сделать это, который я получил от обратного инжиниринга 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;
0 голосов
/ 28 мая 2010

может попробовать объединение

select all the messages sent by user received by me
union 
select all the messages received by user sent by me
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...