2011-03-16 5 views
1

J'ai du mal à écrire une requête qui dépend des résultats de deux tables qui ont leurs propres opérations de requête.Comment puis-je écrire cette requête imbriquée?

Quelqu'un peut-il m'aider?


Mon travail est autour des axes suivants:

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

Cordialement, Scott Nimrod

+0

Désolé, je ne suis pas revenu en arrière à ce problème pour le vérifier encore. –

+0

Oui. Les deux tables appartiennent au même contexte de données. –

+0

J'ai mis à jour ma solution pour prendre en compte le contexte de données uniques. Une dernière question, quel ORM utilisez-vous? LINQ à SQL? Cadre d'entité? –

Répondre

0

Voyant que les MessageRecievers sont chargés à partir du même contexte de données que les messages que nous pouvons les joindre à la même requête.

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

Cela se traduira par SQL similaire à ce qui suit: (en supposant que vous utilisez LINQ to SQL ou LINQ à EF avec un fournisseur de Microsoft SQL)

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

Je vous préviens que ce type d'approche ne fonctionne que dans les scénarios où vous avez un nombre limité d'ID potentiels qui correspondent. Si vous dépassez un certain nombre, LINQ commettra une erreur si vous avez trop de paramètres. –

+0

Bon point, je vais mettre à jour ma réponse. J'espérais que le PO répondrait à ma question parce que la liste d'identification pourrait ne pas être nécessaire en fonction de l'origine de la collection MessageReceiver. –