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