Linq在几个表的日期范围内查询?

时间:2013-10-14 13:52:10

标签: linq signalr spam

我正试图在SignalR聊天应用程序中找到一种检测垃圾邮件的方法。每次用户发送消息时,我都想检查该用户在过去5秒内发送的消息量。我有一个包含2个表的数据库:Message和User,其中消息使用MessageDate记录,用户使用UserID记录。表之间存在多对一关系(每个消息1个用户,每个用户多个消息)。

如何编写查询以检查特定用户在过去5秒内发送的消息?

我曾尝试在线寻找解决方案,但我对查询不熟悉并且很难把所有事情都弄好(连接,日期范围,使用计数属性和正确获取数据模型)。​​

我得到的最接近的是:

var db = new MessageContext();
int messageCount = (from op in db.Message
              join pg in db.User on op.UserID equals pg.UserID
              where pg.UserID == op.UserID 
                    && (a.Start.Date >= DateTime.Now.AddSeconds(-5) 
                        && a.Start.Date <= DateTime.Now)
              select op)
             .Count();

提前致谢,任何有用的帮助!

1 个答案:

答案 0 :(得分:1)

实际上我不明白为什么你需要一个连接,如果你有多对多的关系你不应该需要一个连接(你应该有导航属性)所以代码应该是这样的:

var q = db.Users
   .Select(usr=>
   new
   {
       User = usr,
       LastMessages = usr.Messages
        .OrderByDescending(msg=>msg.Date)
        .Take(5)
   })
   .Where(usr=>usr.LastMessages.All(msg=>msg.UpdateDate >= 5 minutes from now)
// Here q contains all the users that have posted 5 messages or more in the last 5 minutes as well as those last messages.