簡體   English   中英

具有多個連接條件的流暢LINQ查詢,其中一個是簡單等於,另一個是小於id之間的比較

[英]Fluent LINQ query with multiple join conditions, one of which being a simple equals and another a less than comparison between ids

我有一個SQL查詢,其中包括一個左連接和一個組 - 到目前為止很好 - 我的麻煩來自其中一個連接條件不是直接的“等於”而且我迷失了LINQ的位置。

我知道多個連接條件通常涉及創建幾個匿名對象並比較它們,但是當我添加“等於”和“更大”而不是混合時,我不知道這是如何適用的。

如果我發明了LINQ,這就是我想要的查詢,但我知道我的連接條件中的“和”是無效的;

        var query =
            from csp in db.ChatSessionPersons
            join cm in db.ChatMessages on 
                csp.ChatSessionId equals cm.ChatSessionId 
                and cm.Id > csp.LastReadChatMessageId  
                        // (i know these should be the other way round, 
                        // but for readability I present them like this!)
            into j1
            from j2 in j1.DefaultIfEmpty()
            group j2 by csp.ChatSessionId into grouped
            select new {
                  ChatSessionId = grouped.Key, 
                  UnreadCount = grouped.Count(t => t.Id != null)};

任何人的想法?

您可以將非平等的條件下轉換為拉姆達Where上組加入結果。

var query = from csp in db.ChatSessionPersons
            join cm in db.ChatMessages on csp.ChatSessionId equals cm.ChatSessionId into cmj
            select new {
                ChatSessionId = csp.ChatSessionId, 
                UnreadCount = cmj.Where(cm => cm.Id > csp.LastReadChatMessageId).Count()
            };

注:我修改了查詢了一下,以除去group by這如果你正在使用一組加入一個已經分組的匹配結果是不需要的,並去除左連接DefaultIfEmpty這也並不需要處理一組時加入類似Count東西,除非你想在沒有匹配時返回1的UnreadCount ,在這種情況下你應該在Count()之前放置DefaultIfEmpty() Count()

當然,您可以在子查詢中使用查詢理解:

var query = from csp in db.ChatSessionPersons
            join cm in db.ChatMessages on csp.ChatSessionId equals cm.ChatSessionId into cmj
            select new {
                ChatSessionId = csp.ChatSessionId, 
                UnreadCount = (from cm in cmj where cm.Id > csp.LastReadChatMessageId select cm).Count()
            };

暫無
暫無

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

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