public EnterpriseSyncDto GetEnterpriseForSync(string enterpriseId)
        {
            using (var db = new BCEnterpriseContext())
            {
                var tempData = (from ep in db.Enterprises
                                where ep.EnterpriseID == enterpriseId
                                join dp in db.Departments on ep.EnterpriseID equals dp.EnterpriseID into tempDP
                                join user in db.FrontUsers on ep.EnterpriseID equals user.EnterpiseID into tempUser
                                join rl in db.RFARoles on ep.EnterpriseID equals rl.OwnerID into tempRL
                                select new
                {
                    EnterpriseID = ep.EnterpriseID,
                    Departments = (
                        from tdp in tempDP.DefaultIfEmpty()
                        where !tdp.Deleted
                        select tdp),
                    FrontUsers = (
                        from tur in tempUser.DefaultIfEmpty()
                        select new
                    {
                        tur.UserID,
                        tur.Name,
                        tur.DepartmentID,
                        tur.Closed
                    }
                        ),
                    UserRoles = (
                        from tul in tempRL.DefaultIfEmpty()
                        join ur in db.UserRoles on tul.RoleID equals ur.RoleID into tempUR
                        from tur in tempUR.DefaultIfEmpty()
                        where tul.Available && (tur == null || !tur.Deleted)
                        select new
                    {
                        RoleId = tul.RoleID,
                        RoleName = tul.Name,
                        Available = tul.Available,
                        UserID = tur.UserID,
                        Deleted = tur != null && tur.Deleted
                    }
                        ).Union(
                        from tul in db.RFARoles
                        where tul.OwnerID == null
                        join ur in db.UserRoles on tul.RoleID equals ur.RoleID into tempUR
                        from tur in tempUR.DefaultIfEmpty()
                        join user in tempUser on tur.UserID equals user.UserID into tempUser2
                        from tuser in tempUser2.DefaultIfEmpty()
                        where tul.Available && (tur == null || !tur.Deleted) && tuser != null
                        select new
                    {
                        RoleId = tul.RoleID,
                        RoleName = tul.Name,
                        Available = tul.Available,
                        UserID = tur.UserID,
                        Deleted = tur != null && tur.Deleted
                    }
                        )
                }).FirstOrDefault();
                if (tempData == null)
                {
                    return(new EnterpriseSyncDto());
                }

                var result = new EnterpriseSyncDto
                {
                    EnterpriseID = tempData.EnterpriseID,
                    Departments  = tempData.Departments.Select(obj => (DepartmentSyncDto)obj).ToArray(),
                    FrontUsers   = tempData.FrontUsers.Select(n => new FrontUserSyncDto
                    {
                        EnterpriseID = tempData.EnterpriseID,
                        UserID       = n.UserID,
                        Name         = n.Name,
                        Closed       = n.Closed,
                        DepartmentID = n.DepartmentID
                    }).ToArray(),
                    UserRoles = tempData.UserRoles.Select(n => new UserRoleSyncDto
                    {
                        EnterpriseID = tempData.EnterpriseID,
                        UserID       = n.UserID,
                        RoleID       = n.RoleId,
                        RoleName     = n.RoleName,
                        Deleted      = n.Deleted || !n.Available
                    }).ToArray()
                };

                return(result);
            }
        }
        public EnterpriseSyncDto GetEnterpriseForSync(string enterpriseID, string userID, string deviceID)
        {
            using (var db = new BCEnterpriseContext())
            {
                //  同步表中无此用户和设备ID时,创建此记录并将Organization数据初始化发送给APP
                if (null == db.SyncStates.FirstOrDefault(o => (o.UserID == userID) && (o.DeviceID == deviceID) &&
                                                         ((o.ActionType == (byte)TypeEnum.User) || (o.ActionType == (byte)TypeEnum.Role) || (o.ActionType == (byte)TypeEnum.Department))))
                {
                    var syncDepartment = new SyncState()
                    {
                        ActionType = (byte)TypeEnum.Department, DeviceID = deviceID, UserID = userID
                    };
                    var syncUser = new SyncState()
                    {
                        ActionType = (byte)TypeEnum.User, DeviceID = deviceID, UserID = userID
                    };
                    var syncRole = new SyncState()
                    {
                        ActionType = (byte)TypeEnum.Role, DeviceID = deviceID, UserID = userID
                    };
                    AddSyncState(syncDepartment, syncUser, syncRole);
                    return(GetEnterpriseForSync(enterpriseID));
                }

                var tempData = (from ep in db.Enterprises
                                where ep.EnterpriseID == enterpriseID
                                join dp in db.Departments on ep.EnterpriseID equals dp.EnterpriseID into tempDP
                                join user in db.FrontUsers on ep.EnterpriseID equals user.EnterpiseID into tempUser
                                join rl in db.RFARoles on ep.EnterpriseID equals rl.OwnerID into tempRL
                                select new
                {
                    EnterpriseID = ep.EnterpriseID,
                    Departments = (
                        from tdp in tempDP.DefaultIfEmpty()
                        //where !tdp.Deleted
                        from st in db.SyncStates
                        where st.UserID == userID && st.DeviceID == deviceID && st.ActionType == (byte)TypeEnum.Department && st.SyncTime <= tdp.UpdateTime
                        select tdp),
                    FrontUsers = (
                        from tusr in tempUser.DefaultIfEmpty()
                        from st in db.SyncStates
                        where st.UserID == userID && st.DeviceID == deviceID && st.ActionType == (byte)TypeEnum.User && st.SyncTime <= tusr.UpdateTime
                        select new
                    {
                        tusr.UserID,
                        tusr.Name,
                        tusr.DepartmentID,
                        tusr.Closed,
                    }
                        ),
                    UserRoles = (
                        from tul in tempRL.DefaultIfEmpty()
                        join ur in db.UserRoles on tul.RoleID equals ur.RoleID into tempUR
                        from tur in tempUR.DefaultIfEmpty()
                        //where tul.Available && (tur == null || !tur.Deleted)
                        from st in db.SyncStates
                        where st.UserID == userID && st.DeviceID == deviceID && st.ActionType == (byte)TypeEnum.Role && (st.SyncTime <= tul.UpdateTime || tur == null || st.SyncTime <= tur.UpdateTime)
                        select new
                    {
                        RoleId = tul.RoleID,
                        RoleName = tul.Name,
                        Available = tul.Available,
                        UserID = tur.UserID,
                        Deleted = tur != null && tur.Deleted
                    }
                        ).Union(
                        from tul in db.RFARoles
                        where tul.OwnerID == null
                        join ur in db.UserRoles on tul.RoleID equals ur.RoleID into tempUR
                        from tur in tempUR.DefaultIfEmpty()
                        join user in tempUser on tur.UserID equals user.UserID into tempUser2
                        from tuser in tempUser2.DefaultIfEmpty()
                        where tul.Available && (tur == null || !tur.Deleted) && tuser != null
                        from st in db.SyncStates
                        where st.UserID == userID && st.DeviceID == deviceID && st.ActionType == 3 && (st.SyncTime <= tul.UpdateTime || (tur == null || st.SyncTime <= tur.UpdateTime))
                        select new
                    {
                        RoleId = tul.RoleID,
                        RoleName = tul.Name,
                        Available = tul.Available,
                        UserID = tur.UserID,
                        Deleted = tur != null && tur.Deleted
                    }
                        )
                }).FirstOrDefault();
                if (tempData == null)
                {
                    return(new EnterpriseSyncDto());
                }

                var result = new EnterpriseSyncDto
                {
                    EnterpriseID = tempData.EnterpriseID,
                    Departments  = tempData.Departments.Select(obj => (DepartmentSyncDto)obj).ToArray(),
                    FrontUsers   = tempData.FrontUsers.Select(n => new FrontUserSyncDto
                    {
                        EnterpriseID = tempData.EnterpriseID,
                        UserID       = n.UserID,
                        Name         = n.Name,
                        Closed       = n.Closed,
                        DepartmentID = n.DepartmentID
                    }).ToArray(),
                    UserRoles = tempData.UserRoles.Select(n => new UserRoleSyncDto
                    {
                        EnterpriseID = tempData.EnterpriseID,
                        UserID       = n.UserID,
                        RoleID       = n.RoleId,
                        RoleName     = n.RoleName,
                        Deleted      = n.Deleted || !n.Available
                    }).ToArray()
                };

                return(result);
            }
        }