2016-05-01 32 views
0

我要創建這個SQL查詢來LINQ:我該如何修復linq查詢來選擇組的id數?

SELECT 
    COUNT(m.FromUserId) AS Messages, 
    m.FromUserId AS UserId 
FROM  
    dbo.ChatMessages m 
INNER JOIN 
    dbo.ChatMessagesRead mr ON mr.ChatMessageId = m.ChatMessageId 
WHERE 
    m.ToUserId = @toUserId 
GROUP BY 
    m.FromUserId 

我曾嘗試創建以下LINQ查詢:

var messages = from m in _dbContext.ChatMessages 
       join mread in _dbContext.ChatMessagesRead on m.ChatMessageId equals mread.ChatMessageId 
       where m.ToUserId == userId 
       group m by m.FromUserId into g 
       select new 
         { 
         UserId = g.Key, 
         Messages = g.Count() 
         }; 

var messagesList = messages.ToList(); 

但是,這是行不通的。

我該如何解決這個linq查詢?

我得到此異常:

類型中的表達 'System.Func 2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier 2 [Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32]' 不能使用方法'System.Collections.Generic.IEnumerable 1[System.Linq.IGrouping 2的System.Func 2[<>f__AnonymousType1 2 [Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32]'參數[System.Int32, Project.BL.ChatMessages.ChatMessages]] _GroupBy [<> f__AnonymousType1 2,Int32,ChatMessages](System.Collections.Generic.IEnumerable 1 [<> f__AnonymousType1 2[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead]], System.Func 2 [<> f__AnonymousType1 2[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32], System.Func 2 [<> f__AnonymousType1`2 [Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],Project.BL.ChatMessages.ChatMessages])」'

+1

您確定您的數據庫表中有該用戶的記錄嗎?你的代碼對我來說看起來很好。 – Shyju

+0

@Shyju我用我得到的異常更新了我的問題。謝謝。 – Jenan

+0

你可以請分享實體的代碼嗎?也許有一個小問題導致這個例外。 – Gabor

回答

1

我面臨着同樣的問題,我發現有對Entity Framework Core bugtracker

打開的問題,現在唯一的解決方法似乎分割請求成兩半。

var filtered = (from m in _dbContext.ChatMessages 
       join mread in _dbContext.ChatMessagesRead on m.ChatMessageId equals mread.ChatMessageId 
       where m.ToUserId == userId 
       select m).ToList(); 

var messages = from m in filtered 
       group m by m.FromUserId into g 
       select new 
        { 
        UserId = g.Key, 
        Messages = g.Count() 
        }; 
0

您的代碼應該工作。不過,我使用擴展方法創建了另一個版本的查詢。

var messages = 
    _dbContext 
     .ChatMessages 
     .Where(message => message.ToUserId == userId) 
     .Join(
      _dbContext.ChatMessageRead, 
      message => message.ChatMessageId, 
      readMessage => readMessage.ChatMessageId, 
      (m, mr) => m.FromUserId 
     ) 
     .GroupBy(id => id) 
     .Select(group => 
      new 
      { 
       UserId = group.Key, 
       Messages = group.Count() 
      } 
     ); 

如果它也引發同樣的異常,您可以試試嗎?

+0

此代碼返回異常:類型'System.Func'2的表達式[Microsoft.Data.Entity.Query.EntityQueryModelVisitor + TransparentIdentifier'2 [Microsoft.Data.Entity.Storage.ValueBuffer,Microsoft.Data.Entity.Storage.ValueBuffer ],System.Int32]'不能用於方法'System.Collections.Generic.IEnumerable'1 [System.Linq.IGrouping'2]的類型'System.Func'2 [System.Int32,System.Int32]'的參數[System.Int32,System.Int32]] _GroupBy [Int32,Int32,Int32](System.Collections.Generic.IEnumerable'1 [System.Int32],System.Func'2 [System.Int32,System.Int32],System .Func'2 [System.Int32,System.Int32])」 – Jenan

0

你可以試試這個

var res = ctx.MyTable // Start with your table 
     .GroupBy(r => r.id)/Group by the key of your choice 
     .Select(g => new {Id = g.Key, Count = g.Count()}) // Create an anonymous type w/results 
     .ToList(); // Convert the results to List