.net LINQ从HashSet中的两个属性创建/筛选对象

.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;

有三个类:用户、组和字段。用户/组上的多对多关系和组字段上的多对多关系。用户/组关系非常简单,因为用户是否只是组的成员。组/字段关系更为复杂,因为该关系上存在权限属性

在ctor中,我传递关系的哈希集,所以有一个主节点

最后是问题。我如何才能更好地筛选到组FieldAuthority?看见在下面的代码中

    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)??不管怎么说,这是一种编译。我没有用数据测试过它,但它看起来是正确的。谢谢