我正在尝试使用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)。等式取决于几个属性(时间戳,几个字符串等)。
答案 0 :(得分: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();
}
}