2013-10-14 58 views
0

我試圖找到一種方法來檢測我的SignalR聊天應用程序中的垃圾郵件。每次用戶發送消息時,我都想檢查該用戶最近5秒發送的消息數量。我有一個包含兩個表的數據庫:消息和用戶,其中消息通過MessageDate和具有UserID的用戶進行記錄。表格之間存在多對一關係(每個消息1個用戶,每個用戶多個消息)。在幾個表上的日期範圍內的Linq查詢?

如何編寫查詢以檢查特定用戶在過去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(); 

在此先感謝,任何幫助appriciated!

+0

什麼問題? –

+0

這感覺就像一個糟糕的解決方案:爲什麼每次都要搜索整個數據庫?也許你可以有第二張桌子,只要保持時間和身份證,並經常去掉舊的價值觀。這將計算複雜度降低到接近恆定時間,並簡化了您的邏輯。 –

+0

我建議使用Linq來反應性擴展。你應該爲進入的消息創建一個Observable。真的。不要使用像這樣的數據庫。赫克不要在所有的地方使用數據庫。 Entity Framework並不是唯一存在的Linq Provider,而Reactive Extension被許多人稱爲Linq未來事件。 – Aron

回答

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. 
+0

感謝您的回答,但關係是一對多(每個消息1個用戶,每個用戶多個消息)。任何有關如何更改代碼的想法? – JazzMaster

+0

它沒有。代碼的意思是:1用戶=多條消息,1條消息= 1用戶 –

+0

你是完全正確的,感謝您的幫助! – JazzMaster