/// <summary>
        /// Get data collectors.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public GXDataCollectorsResponse Post(GXDataCollectorsRequest request)
        {
            lock (Db)
            {
                IAuthSession s  = this.GetSession(false);
                long         id = 0;
                List <GXAmiDataCollector> list = new List <GXAmiDataCollector>();
                if (long.TryParse(s.Id, out id))
                {
                    if (request.DataCollectorId != 0)
                    {
                        list = Db.Select <GXAmiDataCollector>(q => q.Id == request.DataCollectorId);
                    }
                    //Return all unassigned data controllers.
                    else if (request.UnAssigned)
                    {
                        string query = string.Format("SELECT * FROM {0} WHERE Removed IS NULL AND UnAssigned = TRUE",
                                                     GuruxAMI.Server.AppHost.GetTableName <GXAmiDataCollector>(Db));
                        list = Db.Select <GXAmiDataCollector>(query);
                    }
                    //Return all data controllers that Device can access.
                    else if (request.DeviceId != 0)
                    {
                        list = GetDataCollectorsByDevice(s, Db, request.DeviceId, 0, request.Removed);
                    }
                    //Return all data controllers by mac address.
                    else if (request.MacAddress != null)
                    {
                        list = Db.Select <GXAmiDataCollector>(q => q.MAC == MacToString(request.MacAddress).Replace(":", ""));
                    }
                    else if (request.IPAddress != null)
                    {
                        list = Db.Select <GXAmiDataCollector>(q => q.IP == request.IPAddress);
                    }
                    else if (request.Guid != Guid.Empty)
                    {
                        list = Db.Select <GXAmiDataCollector>(q => q.Guid == request.Guid);
                    }
                    else //Return all data contollers that user can access.
                    {
                        list = GetDataCollectorsByUser(s, Db, request.UserId, 0, request.Removed, null, SearchOperator.None, SearchType.All);
                    }
                }
                else //DC asks available DCs.
                {
                    list = Db.Select <GXAmiDataCollector>(q => q.Guid == new Guid(s.UserAuthName));
                }

                //Remove excluded data collectors.
                if (request.Excluded != null && request.Excluded.Length != 0)
                {
                    List <ulong> ids = new List <ulong>(request.Excluded);
                    var          excludeUserGroups = from c in list where !ids.Contains(c.Id) select c;
                    list = excludeUserGroups.ToList();
                }
                //Get data collectors 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();
                }
                //Change date time from Universal time to local time
                foreach (GXAmiDataCollector it in list)
                {
                    if (it.LastRequestTimeStamp.HasValue)
                    {
                        it.LastRequestTimeStamp = it.LastRequestTimeStamp.Value.ToLocalTime();
                    }
                }
                return(new GXDataCollectorsResponse(list.ToArray()));
            }
        }
        /// <summary>
        /// Get data collectors.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public GXDataCollectorsResponse Post(GXDataCollectorsRequest request)
        {
            lock (Db)
            {
                IAuthSession s = this.GetSession(false);
                long id = 0;
                List<GXAmiDataCollector> list = new List<GXAmiDataCollector>();
                if (long.TryParse(s.Id, out id))
                {
                    if (request.DataCollectorId != 0)
                    {
                        list = Db.Select<GXAmiDataCollector>(q => q.Id == request.DataCollectorId);
                    }
                    //Return all unassigned data controllers.
                    else if (request.UnAssigned)
                    {
                        string query = string.Format("SELECT * FROM {0} WHERE Removed IS NULL AND UnAssigned = TRUE",
                            GuruxAMI.Server.AppHost.GetTableName<GXAmiDataCollector>(Db));
                        list = Db.Select<GXAmiDataCollector>(query);
                    }
                    //Return all data controllers that Device can access.
                    else if (request.DeviceId != 0)
                    {
                        list = GetDataCollectorsByDevice(s, Db, request.DeviceId, 0, request.Removed);
                    }
                    //Return all data controllers by mac address.
                    else if (request.MacAddress != null)
                    {
                        list = Db.Select<GXAmiDataCollector>(q => q.MAC == MacToString(request.MacAddress).Replace(":", ""));
                    }
                    else if (request.IPAddress != null)
                    {
                        list = Db.Select<GXAmiDataCollector>(q => q.IP == request.IPAddress);
                    }
                    else if (request.Guid != Guid.Empty)
                    {
                        list = Db.Select<GXAmiDataCollector>(q => q.Guid == request.Guid);
                    }
                    else //Return all data contollers that user can access.
                    {
                        list = GetDataCollectorsByUser(s, Db, request.UserId, 0, request.Removed, null, SearchOperator.None, SearchType.All);
                    }
                }
                else //DC asks available DCs.
                {
                    list = Db.Select<GXAmiDataCollector>(q => q.Guid == new Guid(s.UserAuthName));
                }

                //Remove excluded data collectors.
                if (request.Excluded != null && request.Excluded.Length != 0)
                {
                    List<ulong> ids = new List<ulong>(request.Excluded);
                    var excludeUserGroups = from c in list where !ids.Contains(c.Id) select c;
                    list = excludeUserGroups.ToList();
                }
                //Get data collectors 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();
                }
                //Change date time from Universal time to local time
                foreach (GXAmiDataCollector it in list)
                {
                    if (it.LastRequestTimeStamp.HasValue)
                    {
                        it.LastRequestTimeStamp = it.LastRequestTimeStamp.Value.ToLocalTime();
                    }
                }
                return new GXDataCollectorsResponse(list.ToArray());
            }
        }