我正试图在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();
提前致谢,任何有用的帮助!
答案 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.