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?
}
鉴于两者现在具有相同的属性,我现在可以比较它们吗?
您可以使用 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));
}
没有尝试过,但它应该可以工作