在多个表的日期范围内进行Linq查询?
我正试图找到一种方法来检测我的信号聊天应用程序中的垃圾邮件。每次用户发送消息时,我都要检查该用户在过去5秒钟内发送的消息量。我有一个包含两个表的数据库:Message和User,其中Message使用MessageDate记录,users使用UserID记录。表之间存在多对一关系(每条消息一个用户,每条用户几条消息) 如何编写查询以检查特定用户在过去5秒钟内发送的消息 我曾尝试在网上寻找解决方案,但我对查询还不熟悉,很难做到一切都正确(连接、日期范围、使用计数属性和正确获取数据模型) 我得到的最接近的结果是:在多个表的日期范围内进行Linq查询?,linq,signalr,spam,Linq,Signalr,Spam,我正试图找到一种方法来检测我的信号聊天应用程序中的垃圾邮件。每次用户发送消息时,我都要检查该用户在过去5秒钟内发送的消息量。我有一个包含两个表的数据库:Message和User,其中Message使用MessageDate记录,users使用UserID记录。表之间存在多对一关系(每条消息一个用户,每条用户几条消息) 如何编写查询以检查特定用户在过去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();
var db=newmessagecontext();
int messageCount=(来自db.Message中的op
将pg加入db.User on op.UserID等于pg.UserID
其中pg.UserID==op.UserID
&&(a.Start.Date>=DateTime.Now.AddSeconds(-5)
&&a.Start.Date事实上,我完全不明白为什么您需要加入,如果您有多对多关系,您不应该需要加入(您应该有导航属性),因此代码应该如下所示:
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.
这感觉像是一个糟糕的解决方案:为什么每次都搜索整个数据库?也许你可以有第二个表,只保留时间和id的大头钉,并每隔一段时间删除旧值。这将计算复杂性降低到接近恒定的时间,并简化逻辑。我建议使用Linq进行反应式扩展。你应该为传入的消息创建一个可观察的。说真的。不要使用这样的数据库。切记,不要使用数据库。实体框架不是唯一存在的Linq提供程序,许多人将响应式扩展描述为未来事件的Linq。非常感谢您的回答。使用RX看起来真的很聪明,是解决这个问题的好方法。我目前没有这样做的经验,但可能有很好的指南可以学习。谢谢你的回答,但这种关系是一对多的(每个消息一个用户,每个用户几条消息)。你知道这会如何改变代码吗?它不会。代码的目的正是:1个用户=多条消息,1个消息=1个用户如果有人再次阅读,我的结论是:var query=context.messages.Where(p=>p.MessageDate>EntityFunctions.AddSeconds(DateTime.Now,-10)).Count();