[英]Translate SQL query into a LINQ expression
所以我正在開發一個簡單的收件箱聊天。 我需要收集所有最新用戶的直接消息。 為此,我編寫了一個 SQL 查詢,該查詢按預期工作,但 LINQ 版本沒有。 有人知道如何將 SQL 正確翻譯成 LINQ 嗎?
這個
CreatedAt Content ReceiverId CreatedById
1/1/2021 Hello! 2 1
1/1/2021 Hello! 3 1
1/2/2021 Hi! 1 2
應該導致這個
CreatedAt Content ReceiverId CreatedById
1/1/2021 Hello! 3 1
1/2/2021 Hi! 1 2
這是在 MSSQL 上運行的 SQL 查詢:
select created_at = MAX(created_at) from messages
where
receiver_id = '2921295d-f0c0-4162-ec8f-08d9d5c5b3f5' or
created_by_id = '2921295d-f0c0-4162-ec8f-08d9d5c5b3f5'
group by IIF(created_by_id = receiver_id, created_by_id, receiver_id)
order by created_at
LINQ:
(from message in Query.Where(x => x.ReceiverId == 1 || x.CreatedById == 1)
group message by new { message.CreatedById, message.ReceiverId }
into groupped
select new InboxItemDto
{
CreatedAt = groupped.Max(z => z.CreatedAt),
Content = groupped.FirstOrDefault().Content,
Receiver = groupped.Key.CreatedById == 1
? groupped.FirstOrDefault().Receiver.FirstName
: groupped.FirstOrDefault().CreatedBy.FirstName,
Type = groupped.FirstOrDefault().Type
}).OrderByDescending(x => x.CreatedAt)
.ToList();
Id 應該是整數而不是字符串。 你有 '1' 這是一個字符串。 receiver_id 和 created_by id 怎么都為 1 並且 create_by 大於 receiver_id? 嘗試以下操作:
class Program
{
static void Main(string[] args)
{
List<Message> messages = new List<Message>();
var created_at = messages.Where(x => ((x.receiver_id == 1) || (x.created_by_id == 1)) && (x.created_by_id > x.receiver_id))
.OrderBy(x => x.created_at)
.ThenBy(x => x.desc)
.GroupBy(x => new object[] { x.created_by_id, x.receiver_id })
.ToList();
}
}
public class Message
{
public int receiver_id { get; set; }
public int created_by_id { get; set; }
public DateTime created_at {get;set;}
public string desc { get; set; }
}
嘗試以下查詢。 它應該返回所需的結果。
小提示:我看不到這種情況的原因IIF(created_by_id = receiver_id, created_by_id, receiver_id)
,它始終是receiver_id
。 無論如何添加到查詢中。
var filteredWithKey =
from message in Query
where message.ReceiverId == 1 || message.CreatedById == 1
select new
{
UserKey = message.ReceiverId == message.CreatedById ? message.CreatedById : message.ReceiverId,
Message = message
};
var query =
from k in filteredWithKey.Select(k => new { k.UserKey }).Distinct()
from lastMessage in filteredWithKey
.Where(x => x.UserKey == k.UserKey)
.Select(x => x.Message)
.OrderByDescending(m => m.CreatedAt)
.Take(1)
select lastMessage;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.