Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个表的日期范围内进行Linq查询?_Linq_Signalr_Spam - Fatal编程技术网

在多个表的日期范围内进行Linq查询?

在多个表的日期范围内进行Linq查询?,linq,signalr,spam,Linq,Signalr,Spam,我正试图找到一种方法来检测我的信号聊天应用程序中的垃圾邮件。每次用户发送消息时,我都要检查该用户在过去5秒钟内发送的消息量。我有一个包含两个表的数据库:Message和User,其中Message使用MessageDate记录,users使用UserID记录。表之间存在多对一关系(每条消息一个用户,每条用户几条消息) 如何编写查询以检查特定用户在过去5秒钟内发送的消息 我曾尝试在网上寻找解决方案,但我对查询还不熟悉,很难做到一切都正确(连接、日期范围、使用计数属性和正确获取数据模型) 我得到的最

我正试图找到一种方法来检测我的信号聊天应用程序中的垃圾邮件。每次用户发送消息时,我都要检查该用户在过去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();