如何将 linq 查询修复为 select 组依据的 ID 计数?

How can I fix linq query to select count of ids with group by?

我想创建这个 SQL 到 linq 的查询:

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 查询?

我得到这个异常:

Expression of type 'System.Func2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier2[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32]' cannot be used for parameter of type 'System.Func2[<>f__AnonymousType12[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32]' of method 'System.Collections.Generic.IEnumerable1[System.Linq.IGrouping2[System.Int32,Project.BL.ChatMessages.ChatMessages]] _GroupBy[<>f__AnonymousType12,Int32,ChatMessages](System.Collections.Generic.IEnumerable1[<>f__AnonymousType12[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead]], System.Func2[<>f__AnonymousType12[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],System.Int32], System.Func2[<>f__AnonymousType1`2[Project.BL.ChatMessages.ChatMessages,Project.BL.ChatMessages.ChatMessagesRead],Project.BL.ChatMessages.ChatMessages])'"

您的代码应该可以工作。但是,我使用扩展方法创建了另一个版本的查询。

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()
            }
        );

请问是否也抛出同样的异常?

你可以试试这个

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

我遇到了同样的问题,我发现 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()
                  };