2012-04-27 68 views
1

似乎我有一个轻微的问题,我的LINQ,我有一个组的数据合同,我有一个单独的数据合同的消息。消息可以是组的一部分。但是,当我更新消息记录时,它在列出组信息时未反映出来,该消息对于该组仍然是相同的。但是,当我直接列出消息时,更新反映出来了吗?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 }); 
     } 

    } 

严重不明白怎么回事,如果我添加消息到组我做出邮件进行任何更改应该反映。我能想到的唯一的事情就是它添加了一个已经存在的消息的新实例,这意味着我的更新方法只是复制消息,但这个新的被拷贝的记录甚至保存在哪里。如果难以解决,我怎么能更新已被copyToTo /添加到组中的消息(廉价解决方法)?

回答

1

假设一个组可以拥有消息和消息可以有组,你正试图保持5件事情:

  1. 所有组List<Group> Groups = ...
  2. 的所有邮件列表的清单List<Message> messages = ...
  3. 每个组的List<Message> GroupMessages...的消息组
  4. 组中的每个消息的组消息
  5. 实际消息圣人发送给在几个地方

从我可以看到它是没有被正确地维护最后一个更新的组:

  • AddMessagetoGroup您关联一个“新” MessageGroup.GroupMessages。这是一个类的新实例,当您更新其他消息实例时不会自动更新。仅仅因为两条消息具有相同的MessageId并不意味着它们是相同的实例。

  • UpdateMessage你改变一个特定的消息,但只在消息列表。这并不指向组列表中的相同消息。

总而言之,您需要重构才能真正让您的代码达到您想要的效果。我看到的方式是,您希望将组和消息分开,并从另一个引用一次,而不是创建副本。

首先,主列表:

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

其次,创建更新消息(你没有还的部分创建):

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

注意如何照顾将此消息添加到消息列表中。这是应该添加或更改消息的唯一功能。

,最后加入的消息到组(注意:我不担心这里添加组):

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衙门的理解和一个​​非常明确和简洁的答案。 – 2012-04-27 06:56:28

+0

嗯真正奇怪的是使用上述,底层连接已关闭:接收时发生意外错误。任何时候我尝试列出组,消息? – 2012-04-27 07:28:42

+0

这似乎与我们可以看到的代码没有任何关系 - 可能您正在使用连接到基础源的LINQ,并且延迟执行导致问题。什么是配置?也许值得一个不同的问题。 – yamen 2012-04-27 07:51:01