asp.net 中的 Linq 查询

本文关键字:查询 Linq 中的 net asp | 更新日期: 2023-09-27 18:33:44

我在下面有这个函数,用于获取那些尚未分配的角色。我现在有两个清单。

一个具有所有角色,另一个具有已分配给该用户的角色。

如何仅返回所有角色中存在但尚未具有角色的那些?

  public dynamic GiveRolesWhichAreNotAssignedToThisUser(String token, String selectedUser, String selectedOrganization)
    {
        User u = InstaFood.Core.User.Get(selectedUser);
        var allRoles = RolesType.GetByOrganizationType(selectedOrganization).Select(i => new
        {
            ID = i.Id,
            Name = i.Name
        });
        var alreadyHaveRoles = u.GetUserRoles().Select(i => new
        {
            ID = i.roleTypeId,
            Name = ""        
        });
        return ?? // what should be done here?
    }

鉴于两者现在具有相同的属性,我现在可以比较它们吗?

asp.net 中的 Linq 查询

您可以使用 Except 返回两个序列的差值,例如:

var difference=allRoles.Except(alreadyHaveRoles);

这假定两个序列包含相同类型的项。使用其Equals实现检查对象的相等性。

如果要使用自己的相等比较,则需要让对象实现 IEquatable,或者创建自定义相等比较器并使用接受自定义相等比较器的 Except 重载。

在您的情况下,您返回两个甚至没有相同字段的匿名类型。人类必须猜测如何比较这两种类型,计算机将拒绝编译代码。如果 ID 相等,则认为两个项目相等,只需返回 ID,例如:

var allRoleIds = RolesType.GetByOrganizationType(selectedOrganization)
                          .Select(i => i.Id);
var assignedRoleIds = u.GetUserRoles().Select(i => i.roleTypeId);
var unassignedRoleIds=allRoleIds.Except(assignedRoleIds);

之后检索未分配的角色是微不足道的,只需使用:

var unassignedRoles=RolesType.GetByOrganizationType(selectedOrganization)
                             .Where(role=>unassingedRoleIds.Contains(role.Id);
 public dynamic GiveRolesWhichAreNotAssignedToThisUser(String token, String selectedUser, String selectedOrganization)
    {
        User u = InstaFood.Core.User.Get(selectedUser);
        var allRoles = RolesType.GetByOrganizationType(selectedOrganization).Select(i => new
        {
            ID = i.Id,
            Name = i.Name
        });
        var alreadyHaveRoles = u.GetUserRoles().Select(i => new
        {
            ID = i.roleTypeId,
            Name = ""        
        });
        return allRoles.Where(i=>!alreadyHaveRoles.Contains(i));
    }

没有尝试过,但它应该可以工作