避免NHibernate中的重复条目

时间:2012-10-19 11:17:21

标签: nhibernate duplicates intersect

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

1 个答案:

答案 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();
    }
}