LINQ для создания / фильтрации объекта из двух свойств в HashSet - PullRequest
0 голосов
/ 27 марта 2012

Три класса: Пользователь, Группа и Поле.Отношения «многие ко многим» для пользователя / группы и отношения «многие ко многим» в поле группыОтношения между пользователем и группой довольно просты, так как пользователь просто является членом группы или нет.Отношение Группа / Поле является более сложным, поскольку в этом отношении есть свойство Authority.

В ctor я передаю HashSets отношений, так что есть один мастер.

Напоследок к вопросу.Как лучше отфильтровать группу GroupAuthority?Увидеть ??в коде ниже.

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

1 Ответ

0 голосов
/ 27 марта 2012

Это то, что вы хотите?

return groupsFieldsAuthority
         .Where(x => x.Group == this)
         .OrderBy(x => x.Group.Name)
         .Select(x => new FieldAuthority(x.FieldDef, x.Authority))
         .ToList();
...