簡體   English   中英

如何使用 Entity Framework Core 從所有消息的數據庫中獲取用戶對話框列表

[英]How to get a list of user dialogs from the database of all messages using Entity Framework Core

我在數據庫中有一個帶有消息的表,即:

| Id | FromId | ToId | Text | Date | Read |

這是 class 的樣子:

public class Message
{
    public int Id { get; set; }
    public IdentityUser From { get; set; }
    public IdentityUser To { get; set; }
    public string Text { get; set; }
    public DateTime Date { get; set; }
    public bool Read { get; set; }
}

我需要使用 Entity Framework Core 形成一個請求以獲取所有用戶對話框的列表。 我已經勾勒出一個示例 SQL 查詢:

SELECT FromId, MAX(Date) as updated_at, sum(Read) as new_messages 
FROM (SELECT FromId, Date, Read 
FROM Messages 
WHERE ToId = 'f3578a36-208c-4504-8f3c-afa564455537' 
UNION SELECT ToId, Date, 0 
FROM Messages 
WHERE FromId = 'f3578a36-208c-4504-8f3c-afa564455537' 
ORDER BY Date DESC) as talks 
GROUP BY FromId 
ORDER BY Date DESC;

其中“f3578a36-208c-4504-8f3c-afa564455537”是我想要獲取其對話列表的用戶的 ID。

但是,我無法使用實體框架執行它(或者不知道如何)。 有沒有辦法只使用EF來做到這一點? 我使用 SQLite。

使用 EF 我會像這樣寫下來,我會分別查詢來自和發往用戶的消息並將它們適當地分組:

var chatsFromUser = dbContext.Messages
    .Where(m => m.From.Id == "f3578a36-208c-4504-8f3c-afa564455537")
    .GroupBy(m => m.To.Id);
var chatsToUser = dbContext.Messages
    .Where(m => m.To.Id == "f3578a36-208c-4504-8f3c-afa564455537")
    .GroupBy(m => m.From.Id);

但是,我還建議您在Message實體 class 中為用戶定義ID屬性:

public class Message
{
    public int Id { get; set; }
    public IdentityUser From { get; set; }
    // choose appropiate type, GUID maybe?
    public string FromId { get; set; }
    public IdentityUser To { get; set; }
    // choose appropiate type, GUID maybe?
    public string ToId { get; set; }
    public string Text { get; set; }
    public DateTime Date { get; set; }
    public bool Read { get; set; }
}

然后查詢會稍微簡化,因為您可以直接從消息 object 訪問 ID:

var chatsFromUser = dbContext.Messages
    .Where(m => m.FromId == "f3578a36-208c-4504-8f3c-afa564455537")
    .GroupBy(m => m.ToId);
var chatsToUser = dbContext.Messages
    .Where(m => m.ToId == "f3578a36-208c-4504-8f3c-afa564455537")
    .GroupBy(m => m.FromId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM