簡體   English   中英

將 SQL 查詢轉換為 LINQ 表達式

[英]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.

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