我打算在到期日结束后自动停用用户。因此,在查看用户帐户详细信息时,超过到期日期的用户帐户应显示为不活动(使用 fa-toggle on/off - 显示帐户的事件/非事件状态 - 在代码中它是一个 boolean 值 true/false ).
现有:
- 点击获取帐户详细信息时,
- 详细信息将从显示的数据库中提取,
- 提取后将显示在应用程序中
我做了什么?
- 点击获取帐户详细信息时,
- 将从显示的数据库中提取详细信息,
- 在向最终用户展示之前,
- 我正在尝试通过比较当前日期和到期日期来更改客户的事件/非事件详细信息。
- 提取后将显示在应用程序中
现有代码:
public IEnumerable<CustomerDetails> GetCustomerDetails(string groupName)
{
IEnumerable<CustomerDetails> customers;
var query = "select up.username, up.firstname, up.lastname, up.lastactivitydate, up.expirydate, " +
"up.activationdate, up.licensedby, up.position, up.isactive as isActiveUser, " +
"wr.rolename, up.usergroup, ul.contracttype as contracttype, ul.numberoflicense as " +
"licensesallowed from userprofile up inner join userlicense ul on ul.id = up.firmid inner join " +
"webpages_UsersInRoles wur on wur.userid = up.userid inner join webpages_Roles wr on " +
"wr.roleid = wur.roleid where ul.firmname='" + firmname.Replace("'", "''") + "' order by up.lastname";
using (IDbConnection dbConnection = new SqlConnection(UserDBConnectionString))
{
dbConnection.Open();
using (var result = dbConnection.QueryMultiple(query, commandTimeout: 300))
{
var accounts = result.Read().ToList();
customers = from account in accounts
select new CustomerDetails
{
FirstName = account.firstname,
LastName = account.lastname,
UserName = account.username,
PreviousUserName = account.username,
Position = account.position,
SharedSpace = JsonConvert.DeserializeObject<string[]>(account.usergroup),
UserRole = account.rolename,
IsActiveUser = account.isActiveUser,
LastActivityDate = account.lastactivitydate != null
? account.lastactivitydate.ToString("yyyy/MM/dd")
: "",
ExpiryDate = TimeZoneInfo.ConvertTimeToUtc((DateTime)account.expirydate),
ActivationDate = TimeZoneInfo.ConvertTimeToUtc((DateTime)account.activationdate),
ContractType = account.contracttype.ToString().Trim(),
LicensesAllowed = account.licensesallowed
};
}
}
return customers;
}
我做的事情是在返回客户详细信息之前,return customers;
。我已经包含了以下一组代码来停用所有超过激活期的用户。但它没有按预期工作。
// code as above shown
var count = customers.Count();
for (var i = 0; i < count;i++)
{
DateTime dateLimit = Convert.ToDateTime(customers.ElementAt(i).ExpiryDate);
DateTime currentDate = DateTime.Now.Date;
int result = DateTime.Compare(dateLimit,currentDate);
if (result == -1)
{
if (customers.ElementAt(i).IsActiveUser == true)
{
var beforeChanged = customers.ElementAt(i).IsActiveUser; // before it is true
customers.ElementAt(i).IsActiveUser = false; // i hope i am setting the value as false
var afterChanged = customers.ElementAt(i).IsActiveUser; // but i am still seeing true only here
}
}
}
return customers
}
编辑-1:
正如我在评论中所说,我可以将此处的值从 true 更改为 false,反之亦然。
编辑-2:
//客户类结构
public class CustomerDetails
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsActiveUser { get; set; }
// some other fields ... goes here
}
设置为false后不知道怎么还是true。
最佳答案
您是 deferred execution 的受害者.
在这里,您查询数据库三次,每次调用customers
。
var beforeChanged = customers.ElementAt(i).IsActiveUser;
customers.ElementAt(i).IsActiveUser = false;
var afterChanged = customers.ElementAt(i).IsActiveUser;
每次,您都从数据库中加载对象,这就是您看不到任何变化的原因。数据库不变。
您需要具体化您的查询,可能是在您构建选择时对客户调用 .ToArray()
或 ToList()
。
关于c# - boolean 值不能改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195195/