2014-01-27 56 views
1

我做了一個簡單的郵件系統和我的SQL表就像LINQ選擇與組由

id | from_id | to_id | text 
--------------------------- 
1 | 10 | 11 | abc 
2 | 11 | 10 | cde 
3 | 10 | 11 | fgh 

例如我「用戶10」,當我將消息發送到「用戶11」我要看看我的消息框如

---> 11 fgh 

並且當用戶11向我發送回覆前。 「hij」我必須看到像

它像Twitter的dm系統。如果我是最後一位發送消息的人,則必須查看我發送消息的人員和消息內容。

return (from data in db.user_messages.AsEnumerable() 
     where data.id == ((from messages in db.user_messages 
          where messages.from_id == data.from_id 
          orderby messages.message_created_at descending 
          select new 
          { 
           messages.id 
          }).Take(1).FirstOrDefault().id) && 
          data.to_id == user.UserId 
          orderby data.message_created_at descending 
     select data).ToList(); 

有了這個代碼,當用戶向我發送一個消息,我只能看到的,如果我是誰發送的最後一條消息的一個,我不能得到任何結果。

我該如何改進這個選擇?謝謝。

+0

什麼是你想選擇 - 從最後一個和最後一個消息?或者只是最後一條消息來自或來自? –

+0

來自我的最後消息文本以及我發送的其他用戶的ID。但如果其他用戶向我發送回覆,我必須查看該用戶的消息內容以及該用戶的ID – user2956229

回答

1

如果你想從用戶的每次談話選擇最後一條消息:

from um in db.user_messages 
where um.from_id == user.UserId || um.to_id == user.UserId 
let otherId = (um.from_id == user.UserId) ? um.to_id : um.from_id 
group um by otherId into g 
select g.OrderByDescending(um => um.message_created_at).FirstOrDefault() 

注:此查詢將被轉換成SQL和數據庫端執行。

顯示交談可以關注一下:

foreach(var message in query.OrderBy(um => um.message_created_at)) 
    Console.WriteLine("{0}{1}{2}", 
     message.from_id == user.UserId ? "--->" : "", 
     message.from_id == user.UserId ? message.to_id : message.from_id, 
     message.text); 

順便說一句,您可以選擇從查詢otherId以避免額外檢查身份證。

+1

,謝謝您的回答,幫助我 – user2956229

0

如果你希望得到的最後消息

db.user_messages.Where(m => 
(m.from_id == user.UserId && m.to_id == otherUser.UserId) || 
(m.from_id == otherUser.UserId && m.to_id == user.UserId)) 
.OrderByDescending(m => m.message_created_at).First();