2012-04-27 4 views
1

내 linq에 약간의 문제가있는 것처럼 보입니다. Groups에 대한 datacontract가 있으며 메시지 용으로 별도의 datacontract가 있습니다. 메시지는 그룹의 일부가 될 수 있습니다. 그러나 그룹 정보를 나열 할 때 메시지 레코드가 업데이트되지 않으면 메시지는 해당 그룹에 대해 여전히 동일합니다. 그러나 메시지를 직접 나열하면 업데이트가 반영됩니까? linq 문제로 관계 생성

//lists for reference: 
    List<Group> Groups = new List<Group>(); 
    List<Message> messages = new List<Message>(); 

    //not sure the below method is correct for adding a message to a group 
    public void AddMessagetoGroup(string group, string messageID, string message) 
    { 
     var result = Groups.Where(n => String.Equals(n.GroupName, group)).FirstOrDefault(); 
     var result1 = messages.Where(n => String.Equals(n.MessageID, messageID)).FirstOrDefault(); 
     if (result != null) 
     { 
      result.GroupMessages.Add(new Message() { MessageID = messageID, GroupMessage = message }); 
     } 
     if (result1 != null) 
     { 
      result1.MessageGroup.Add(new Group() { GroupName = group }); 
     } 

    } 

진심 세드릭 나는 메시지에 나는 모든 변경 사항이 반영되어야 그룹에 메시지를 추가하는 경우, 이해 해달라고 : 나는이 그룹에 메시지를 추가하는 방법

이입니다. 내가 생각할 수있는 유일한 방법은 이미 존재하는 메시지의 새로운 인스턴스를 추가하는 것입니다. 즉, 업데이트 방법은 메시지 만 복사하는 것이지만이 새로운 복사 된 레코드는 어디에 보관할 것입니다. 그 어려운 방법으로 수정하려면 어떻게해야합니까? 내가 복사 한 메시지를 업데이트 할 수 있습니까? 대신 그룹에 추가하십시오 (값싼 해결 방법)? 그룹 메시지를 가질 수 있고 메시지가 그룹을 가질 수 있다고 가정

답변

1

, 당신은 5 가지 유지하기 위해 노력하고있다 : 모든 그룹 List<Group> Groups = ...

  • 모든 메시지의 목록을의

    1. 목록을 List<Message> messages = ...
    2. 각 그룹의 메시지 List<Message> GroupMessages... 그룹
    3. 메시지의 그룹 List<Group> MessageGroup...
    4. 실제 메시지 AddMessagetoGroup에서

      • 당신이에 Message는 '새'를 연결 : 세이지는 여러 곳이 제대로 유지되지 않는 마지막 무엇을 내가 볼 수에서

    에 업데이트 된 그룹에 보낼 Group.GroupMessages. 이 클래스의 새 인스턴스이며 다른 Message 인스턴스를 업데이트 할 때 자동으로 업데이트되지 않습니다. 두 개의 메시지가 동일한 MessageId을 가지고 있다고해서 그것이 동일한 인스턴스라는 것을 의미하지는 않습니다.

  • UpdateMessage에서 메시지 목록 만 변경하면됩니다. 그룹 목록의 동일한 메시지를 가리 키지 않습니다.

  • 무엇보다 원하는 코드를 실제로 리팩터링해야합니다. 내가 보는 방법은 그룹과 메시지를 별도로 유지하고 복사본을 만드는 대신 다른 메시지에서 한 번 참조하기를 원한다는 것입니다.

    첫째, 마스터 목록 :이주의 걸리는

    public Message CreateOrUpdateMessage(string messageID, string groupMessage) 
    { 
        var findmessage = Messages.Where(s => s.MessageID == messageID).FirstOrDefault(); 
    
        if (findmessage != null) 
        { 
         findmessage.GroupMessage = groupMessage; 
        } 
        else 
        { 
         findmessage = new Message() { MessageID = messageID, GroupMessage = groupMessage}; 
         Messages.Add(findmessage); 
        } 
    
        return findmessage; 
    } 
    

    참고 : 메시지를 업데이트 또는을 만드는 두 번째

    List<Group> Groups = new List<Group>(); 
    List<Message> Messages = new List<Message>(); 
    

    , (당신은 아직 생성 부분이없는) 이 메시지를 메시지 목록에 추가하십시오. 이것은 메시지를 추가하거나 변경해야하는 유일한 기능입니다.중 메시지에 중복이 없는지이 기능은 또한 메시지를 생성합니다

    public void AddMessagetoGroup(string group, string messageID, string message) 
    { 
        var findmessage = CreateOrUpdateMessage(messageID, message); 
        var findgroup = Groups.Where(n => String.Equals(n.GroupName, group)).FirstOrDefault(); 
    
        if (findgroup != null) 
        { 
         if (findgroup.GroupMessages.Where(m => m.MessageID == messageID).Count() == 0) 
         { 
          findgroup.GroupMessages.Add(findmessage); 
          findmessage.MessageGroup.Add(findgroup); 
         } 
        } 
    } 
    

    하는 것으로하고, 확인 :

    그룹에 메시지를 추가

    그리고 마지막으로 (내가 여기에 그룹을 추가 걱정하지 마십시오) 특정 그룹에 대한 전체 또는 메시지

    +0

    내가 옳은 길에 있다고 생각하면 너무 혼란 스럽습니다. 구현하고 테스트하는 데 시간이 걸릴 수 있습니다. 따라서 미리 감사 드리며 제 코드를 리팩터링하는 방법에 대해 알아 보겠습니다. +1 야멘 이해와 매우 명확하고 간결한 대답. –

    +0

    흠 뭔가 정말 이상한 일이 위의 사용하고, 기본 연결이 닫혔습니다 : 수신시 예상치 못한 오류가 발생했습니다. 그룹, 메시지를 나열하려고 할 때마다? –

    +0

    이 코드는 우리가 볼 수있는 코드와 아무런 관련이없는 것 같습니다. LINQ를 기본 소스에 연결하여 지연된 실행으로 인해 문제가 발생할 가능성이 있습니다. 구성은 무엇입니까? 아마도 다른 질문에 가치가 있습니다. – yamen