.net LINQ从HashSet中的两个属性创建/筛选对象
有三个类:用户、组和字段。用户/组上的多对多关系和组字段上的多对多关系。用户/组关系非常简单,因为用户是否只是组的成员。组/字段关系更为复杂,因为该关系上存在权限属性 在ctor中,我传递关系的哈希集,所以有一个主节点 最后是问题。我如何才能更好地筛选到组FieldAuthority?看见在下面的代码中.net LINQ从HashSet中的两个属性创建/筛选对象,.net,linq,c#-4.0,linq-to-objects,.net,Linq,C# 4.0,Linq To Objects,有三个类:用户、组和字段。用户/组上的多对多关系和组字段上的多对多关系。用户/组关系非常简单,因为用户是否只是组的成员。组/字段关系更为复杂,因为该关系上存在权限属性 在ctor中,我传递关系的哈希集,所以有一个主节点 最后是问题。我如何才能更好地筛选到组FieldAuthority?看见在下面的代码中 public class Group : Object { private HashSet<UserGroup> usersGroups;
public class Group : Object
{
private HashSet<UserGroup> usersGroups;
private HashSet<GroupFieldAuthority> groupsFieldsAuthority;
public Int16 ID { get; private set; }
public string Name { get; set; }
public List<User> Users
{ get { return usersGroups.Where(x => x.Group == this).Select(x => x.User).OrderBy(x => x.UserID).ToList(); } }
public List<FieldAuthority> FieldsAuthority
{
get
{
// Can this be done more directly??
List<FieldAuthority> fieldsAuthority = new List<FieldAuthority>();
foreach (GroupFieldAuthority gfa in groupsFieldsAuthority.Where(x => x.Group == this).OrderBy(x => x.Group.Name))
{
fieldsAuthority.Add(new FieldAuthority(gfa.FieldDef, gfa.Authority));
}
return fieldsAuthority;
}
}
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
Group fd = (Group)obj;
return (ID == fd.ID);
}
public override int GetHashCode() { return (int)ID; }
public Group(Int16 id, string name, HashSet<UserGroup> UsersGroups, HashSet<GroupFieldAuthority> GroupsFieldsAuthority)
{ ID = id; Name = name; usersGroups = UsersGroups; groupsFieldsAuthority = GroupsFieldsAuthority; }
}
public class GroupFieldAuthority : Object
{
public Group Group { get; private set; }
public FieldDef FieldDef { get; private set; }
public enumAuthRORWMADeny Authority { get; private set; }
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
GroupFieldAuthority item = (GroupFieldAuthority)obj;
return (Group.ID == item.Group.ID);
}
public override int GetHashCode() { return (int)Group.ID ^ (int)FieldDef.ID; }
public GroupFieldAuthority(Group group, FieldDef fieldDef, enumAuthRORWMADeny authority)
{ Group = group; FieldDef = fieldDef; Authority = authority; }
}
public class FieldAuthority : Object
{ // used for FieldDef and Document
public FieldDef FieldDef { get; private set; }
public enumAuthRORWMADeny Authority { get; private set; }
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
FieldAuthority item = (FieldAuthority)obj;
return (FieldDef.ID == item.FieldDef.ID);
}
public override int GetHashCode() { return (int)FieldDef.ID; }
public FieldAuthority(FieldDef fieldDef, enumAuthRORWMADeny authority)
{ FieldDef = fieldDef; Authority = authority; }
}
公共类组:对象
{
私有HashSet用户组;
私有哈希集组字段权限;
public Int16 ID{get;private set;}
公共字符串名称{get;set;}
公共列表用户
{get{return usersGroups.Where(x=>x.Group==this)。选择(x=>x.User)。OrderBy(x=>x.UserID)。ToList();}
公共列表权限
{
得到
{
//这能更直接地做到吗??
列表字段权限=新列表();
foreach(groupsFieldsAuthority.Where(x=>x.Group==this.OrderBy(x=>x.Group.Name))中的GroupFieldAuthority gfa
{
fieldsAuthority.Add(新的FieldAuthority(gfa.FieldDef,gfa.Authority));
}
返回域权限;
}
}
公共覆盖布尔等于(对象对象对象)
{
//检查null并比较运行时类型。
if(obj==null | | GetType()!=obj.GetType())返回false;
fd组=(组)obj;
返回(ID==fd.ID);
}
public override int GetHashCode(){return(int)ID;}
公共组(Int16 id、字符串名称、HashSet UsersGroups、HashSet GroupsFieldsAuthority)
{ID=ID;Name=Name;usersGroups=usersGroups;groupsFieldsAuthority=groupsFieldsAuthority;}
}
公共类GroupFieldAuthority:对象
{
公共组组{get;private set;}
公共字段定义{get;private set;}
公共EnumAuthorWMadeny权限{get;private set;}
公共覆盖布尔等于(对象对象对象)
{
//检查null并比较运行时类型。
if(obj==null | | GetType()!=obj.GetType())返回false;
GroupFieldAuthority项=(GroupFieldAuthority)obj;
返回(Group.ID==item.Group.ID);
}
public override int GetHashCode(){return(int)Group.ID^(int)FieldDef.ID;}
公共组FieldAuthority(组组组、FieldDef FieldDef、EnumAuthorWMadeny权限)
{Group=Group;FieldDef=FieldDef;Authority=Authority;}
}
公共类FieldAuthority:对象
{//用于字段定义和文档
公共字段定义{get;private set;}
公共EnumAuthorWMadeny权限{get;private set;}
公共覆盖布尔等于(对象对象对象)
{
//检查null并比较运行时类型。
if(obj==null | | GetType()!=obj.GetType())返回false;
FieldAuthority项目=(FieldAuthority)obj;
返回(FieldDef.ID==item.FieldDef.ID);
}
public override int GetHashCode(){return(int)FieldDef.ID;}
公共FieldAuthority(FieldDef FieldDef、EnumAuthorWMadeny权限)
{FieldDef=FieldDef;Authority=Authority;}
}
这就是你想要的吗
return groupsFieldsAuthority
.Where(x => x.Group == this)
.OrderBy(x => x.Group.Name)
.Select(x => new FieldAuthority(x.FieldDef, x.Authority))
.ToList();
我想你的意思是x=>newfieldauthority(x.FieldDef,x.Authority)??不管怎么说,这是一种编译。我没有用数据测试过它,但它看起来是正确的。谢谢