1

似乎我的 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 });
        }

    }

真的不明白发生了什么,如果我将消息添加到组中,我对消息所做的任何更改都应该得到反映。我唯一能想到的是它添加一个已经存在的消息的新实例,这意味着我的更新方法只是复制消息,但是这个新复制的记录甚至保存在哪里。如果很难修复,我该如何更新已复制到/添加到组的消息(便宜的解决方法)?

4

1 回答 1

1

假设一个组可以有消息,一个消息可以有组,你试图维护 5 件事:

  1. 所有组的列表List<Group> Groups = ...
  2. 所有消息的列表List<Message> messages = ...
  3. List<Message> GroupMessages...组中每个组的消息
  4. List<Group> MessageGroup...消息中每条消息的组
  5. 发送到群组的实际消息在多个地方更新

据我所知,这是最后一个没有正确维护的:

  • AddMessagetoGroup您将“新”关联MessageGroup.GroupMessages. 这是一个类的新实例,当您更新其他 Message 实例时不会自动更新。仅仅因为两条消息相同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);
        }
    }
}

请注意,此函数还将创建消息,并确保消息总数或任何特定组的消息中没有重复项。

于 2012-04-27T06:43:19.533 回答