【问题标题】:How can I write this nested query?我该如何编写这个嵌套查询?
【发布时间】:2011-03-16 16:15:43
【问题描述】:

我正在努力编写一个依赖于两个具有自己查询操作的表的结果的查询。

谁能帮帮我?


我的解决方法如下:

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

问候, 斯科特·尼姆罗德

【问题讨论】:

  • 对不起,我还没有返回这个问题来验证它。
  • 是的。两个表属于同一个数据上下文。
  • 我已更新我的解决方案以考虑单一数据上下文。最后一个问题,您使用的是哪个 ORM? LINQ到SQL?实体框架?

标签: c# sql linq-to-sql wcf-ria-services


【解决方案1】:

由于 MessageRecievers 是从与 Messages 相同的数据上下文加载的,因此我们可以将它们加入到同一个查询中。

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]

【讨论】:

  • 我要提醒的是,这种方法仅适用于匹配的潜在 ID 数量有限的情况。如果超过一定数量,LINQ会报错参数太多。
  • 好点,我会更新我的回复。我希望 OP 能回答我的问题,因为 ID 列表可能不是必需的,具体取决于 MessageReceiver 集合的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多