linq2sql Group-By then Where 的问题

Problem with linq2sql Group-By then Where

我正在尝试获取没有当前角色的用户记录。一个用户可以有多个角色。

我正在使用 2 个表 - Users 和 UserRoleMap

var superAdminRoleId = *GUID*

var query = from user in _userRepository.Table
            join userRoleMap in _userRoleMapRepository.Table
            on user.Id equals userRoleMap.UserId
            // Now, group the roles by the user
            group userRoleMap by user into userRoleMaps
            // get the records that are NOT super admin
            where !userRoleMaps.Any(map=>map.UserId == superAdminRoleId)
            select userRoleMaps.Key;

我遇到了错误

LinqToDB.LinqToDBException: ''map.UserId' cannot be converted to SQL.'

所以我修改为

var query = from user in _userRepository.Table
            join userRoleMap in _userRoleMapRepository.Table
            on user.Id equals userRoleMap.UserId
            // Now, group the roles by the user
            group userRoleMap.UserId by user into userRoleMaps   // changed userRoleMap to userRoleMap.UserId 
            // get the records that are NOT super admin
            where !userRoleMaps.Any(map=>map == superAdminRoleId) // update
            select userRoleMaps.Key;

现在,我得到了

System.ArgumentException: 'Property 'System.Guid Id' is not defined for type 'System.Guid' (Parameter 'property')'

可能有一种方法可以修复您的 group by,但看看您正在尝试完成的事情,我认为您会得到一个性能更好、更简单的查询,如下所示:

var userRoleMaps = _userRoleMapRepository.Table;
var nonAdminUsers = _userRepository.Table
    .Where(user => !userRoleMaps
        .Any(map => map.UserId == user.Id && map.RoleId == superAdminRoleId));