0

SignalR チャット アプリケーションでスパムを検出する方法を探しています。ユーザーがメッセージを送信するたびに、そのユーザーが過去 5 秒間に送信したメッセージの量を確認したいと考えています。Message と User の 2 つのテーブルを持つデータベースがあります。メッセージは MessageDate でログに記録され、ユーザーは UserID でログに記録されます。テーブル間には多対 1 の関係があります (メッセージごとに 1 人のユーザー、ユーザーごとに複数のメッセージ)。

過去 5 秒間に特定のユーザーが送信したメッセージを確認するクエリを作成するにはどうすればよいですか?

オンラインで解決策を探してみましたが、クエリは初めてで、すべてを正しく行うのは困難です (結合、日付の範囲、count プロパティの使用、データ モデルの取得)。

私が得た最も近いものは次のようなものです:

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();

事前に感謝します。

4

1 に答える 1

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.
于 2013-10-15T05:23:25.183 に答える