0

我正在尝试使用 NHibernate 将收到的消息存储在数据库中。但是,有可能两次收到相同的消息,在这种情况下,我不想将副本保存在数据库中。我的第一个想法是执行以下操作:

// in SaveRange(IEnumerable<Message> messages
var alreadyStoredMessages = session.Query<Message>().Intersect(messages);

var newMessages = messages.Except(alreadyStoredMessages);

但是,NHibernate 似乎不支持 Intersect 所以这将导致异常。我知道我总是可以获取所有消息,将它们转换为列表或数组,然后进行相交,但这不会很有效。

Message 类实现了 IEquatable,它还覆盖了 GetHashCode() 和 Equals(object obj)。相等性取决于几个属性(时间戳、几个字符串等)。

4

1 回答 1

1

如果所有新消息同时出现,请使用过滤器:

var alreadyStoredMessages = session.QueryOver<Message>()
    .WhereRestrictionOn(m => m.timestamp).In(messages.Select(m => m.timeStamp))
    .AsEnumerable()
    .Intersect(messages);

var newMessages = messages.Except(alreadyStoredMessages).ToList();

假设重复的消息紧随其后:保存最后 n 条收到消息的缓冲区并查看它们。

var lastMessages = new Queue<Message>(100);
while(true)
{
    var message = GetNextMessage();
    if (!lastMessages.Contains(message))
    {
        lastMessages.Enqueue(message);
        session.Save(message);
        if (lastMessages.Count >= 100);
            lastMessages.Dequeue();
    }
}
于 2012-10-19T11:58:24.343 回答