Как я могу написать этот вложенный запрос? - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь написать запрос, который зависит от результатов двух таблиц, которые имеют свои собственные операции запроса.

Кто-нибудь может мне помочь?


Моя работа заключается в следующем:

    public IQueryable<Message> GetMessages(int user_id)
    {
        // Get MessageReceiver tables that share receiver id
        IQueryable<MessageReceiver> messageReceivers = GetMessageReceivers().Where(messageReceiver => messageReceiver.receiver_id == user_id);

        List<Message> messages = new List<Message>();
        foreach (MessageReceiver messageReceiver in messageReceivers)
        {
            foreach (Message message in DataContext.Messages)
            {
                if (message.id == messageReceiver.message_id)
                {
                    messages.Add(message);
                }
            }
        }

        return messages.AsQueryable<Message>();
    }

С уважением, Скотт Нимрод

1 Ответ

0 голосов
/ 16 марта 2011

Учитывая, что MessageRecievers загружаются из того же контекста данных, что и сообщения, мы можем присоединить их к одному и тому же запросу.

public IQueryable<Message> GetMessages(int user_id)
{    
    // Get MessageReceiver tables that share receiver id
    var messageReceivers = GetMessageReceivers().Where(messageReceiver => messageReceiver.receiver_id == user_id);

    // get all messages that have been recieved by a user
    var messages = from m in DataContext.Messages
                   join r in messageReceivers
                   on m.id equals r.message_id
                   select m;                  

    //return the messages
    return messages;
}

В результате SQL будет выглядеть примерно так: (при условии, что вы используете LINQ to SQL или LINQ to EF с поставщиком Microsoft SQL)

SELECT [t0].[id], ... other columns ...
FROM [Messages] AS [t0]
INNER JOIN [MessageReceivers] AS [t1] ON [t0].[id] = [t1].[message_id]
...