/// <summary>
        /// Get available user groups.
        /// </summary>
        public GXUserGroupResponse Post(GXUserGroupsRequest request)
        {
            lock (Db)
            {
                List <GXAmiUserGroup> list;
                if (request.UserGroupId != 0)
                {
                    list = new List <GXAmiUserGroup>();
#if !SS4
                    list.Add(Db.GetById <GXAmiUserGroup>(request.UserGroupId));
#else
                    list.Add(Db.SingleById <GXAmiUserGroup>(request.UserGroupId));
#endif
                }
                //Returns the user group(s) to which the device belongs to.
                else if (request.DeviceId != 0)
                {
                    throw new NotImplementedException();
                }
                //Returns the user group(s) to which the device group belongs to.
                else if (request.DeviceGroupId != 0)
                {
                    string query = string.Format("SELECT DISTINCT {0}.* FROM {0} INNER JOIN {1} ON {0}.ID = {1}.UserGroupID WHERE DeviceGroupID={2}",
                                                 GuruxAMI.Server.AppHost.GetTableName <GXAmiUserGroup>(Db),
                                                 GuruxAMI.Server.AppHost.GetTableName <GXAmiUserGroupDeviceGroup>(Db),
                                                 request.DeviceGroupId);
                    list = Db.Select <GXAmiUserGroup>(query);
                }
                else
                {
                    list = GetUserGroups(request.UserId, request.Removed);
                }
                //Remove excluded user groups.
                if (request.Excluded != null && request.Excluded.Length != 0)
                {
                    List <long> ids = new List <long>(request.Excluded);
                    var         excludeUserGroups = from c in list where !ids.Contains(c.Id) select c;
                    list = excludeUserGroups.ToList();
                }
                //Get user groups by range.
                if (request.Index != 0 || request.Count != 0)
                {
                    if (request.Count == 0 || request.Index + request.Count > list.Count)
                    {
                        request.Count = list.Count - request.Index;
                    }
                    list.RemoveRange(0, request.Index);
                    var limitUserGroups = list.Take(request.Count);
                    list = limitUserGroups.ToList();
                }
                return(new GXUserGroupResponse(list.ToArray()));
            }
        }
        /// <summary>
        /// Get available user groups.
        /// </summary>
		public GXUserGroupResponse Post(GXUserGroupsRequest request)
		{
            lock (Db)
            {
                List<GXAmiUserGroup> list;
                if (request.UserGroupId != 0)
                {
                    list = new List<GXAmiUserGroup>();
#if !SS4
                    list.Add(Db.GetById<GXAmiUserGroup>(request.UserGroupId));
#else
                    list.Add(Db.SingleById<GXAmiUserGroup>(request.UserGroupId));                    
#endif                    
                }
                //Returns the user group(s) to which the device belongs to.
                else if (request.DeviceId != 0)
                {
                    throw new NotImplementedException();
                }
                //Returns the user group(s) to which the device group belongs to.
                else if (request.DeviceGroupId != 0)
                {
                    string query = string.Format("SELECT DISTINCT {0}.* FROM {0} INNER JOIN {1} ON {0}.ID = {1}.UserGroupID WHERE DeviceGroupID={2}",
                        GuruxAMI.Server.AppHost.GetTableName<GXAmiUserGroup>(Db),
                        GuruxAMI.Server.AppHost.GetTableName<GXAmiUserGroupDeviceGroup>(Db),
                        request.DeviceGroupId);
                    list = Db.Select<GXAmiUserGroup>(query);
                }
                else
                {
                    list = GetUserGroups(request.UserId, request.Removed);
                }
                //Remove excluded user groups.
                if (request.Excluded != null && request.Excluded.Length != 0)
                {
                    List<long> ids = new List<long>(request.Excluded);
                    var excludeUserGroups = from c in list where !ids.Contains(c.Id) select c;
                    list = excludeUserGroups.ToList();
                }
                //Get user groups by range.
                if (request.Index != 0 || request.Count != 0)
                {
                    if (request.Count == 0 || request.Index + request.Count > list.Count)
                    {
                        request.Count = list.Count - request.Index;
                    }
                    list.RemoveRange(0, request.Index);
                    var limitUserGroups = list.Take(request.Count);
                    list = limitUserGroups.ToList();
                }
                return new GXUserGroupResponse(list.ToArray());
            }
		}