2011-03-16 5 views
1

고유 한 쿼리 작업이있는 두 테이블의 결과에 따라 쿼리를 작성하는 데 어려움을 겪고 있습니다.이 중첩 쿼리를 작성하려면 어떻게해야합니까?

아무도 도와 줄 수 있습니까?

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

감사합니다, 스콧 니므롯

+0

죄송합니다 (당신은 마이크로 소프트 SQL 공급자와 EF하기 위해 SQL 또는 LINQ에 LINQ를 사용하고 있다고 가정), 내가 다시 반환하지 않은 이 문제를 아직 확인하려면 –

+0

예. 두 테이블 모두 동일한 데이터 컨텍스트에 속합니다. –

+0

단일 데이터 컨텍스트를 고려하여 솔루션을 업데이트했습니다. ORM이 사용하는 마지막 질문 하나가 있습니까? LINQ to SQL? 엔티티 프레임 워크? –

답변

0

MessageRecievers는 메시지와 같은 데이터 컨텍스트에서로드로보고 우리가 그들에 가입 할 수 있습니다 :


주위에 내 작품은 다음과 같다 동일한 쿼리. 이것은 다음과 같은 SQL 발생합니다

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

:

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

이 유형의 접근 방식은 일치하는 잠재적 인 ID의 수가 제한되어있는 시나리오에서만 작동합니다. 특정 숫자를 초과하면 LINQ는 매개 변수가 너무 많음을 알립니다. –

+0

좋은 지적으로서, 나는 나의 대답을 업데이트 할 것이다. MessageReceiver 컬렉션의 출처에 따라 ID 목록이 불필요하기 때문에 OP가 내 질문에 응답하기를 기대했습니다. –

관련 문제