c# - boolean 值不能改变

标签 c# boolean

我打算在到期日结束后自动停用用户。因此,在查看用户帐户详细信息时,超过到期日期的用户帐户应显示为不活动(使用 fa-toggle on/off - 显示帐户的事件/非事件状态 - 在代码中它是一个 boolean 值 true/false ).

现有:

  1. 点击获取帐户详细信息时,
  2. 详细信息将从显示的数据库中提取,
  3. 提取后将显示在应用程序中

我做了什么?

  1. 点击获取帐户详细信息时,
  2. 将从显示的数据库中提取详细信息,
  3. 在向最终用户展示之前,
  4. 我正在尝试通过比较当前日期和到期日期来更改客户的事件/非事件详细信息。
  5. 提取后将显示在应用程序中

现有代码:

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:

enter image description here

正如我在评论中所说,我可以将此处的值从 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/

相关文章:

c# - 我的 ArrayList 去哪儿了?地铁应用

c# - JSON反序列化。

java - 使用 Spring 验证 boolean 元素是否已显式定义

Python错误: 'numpy.bool_' object is not iterable

C++ |如何在每次不返回值的情况下循环 If 语句

sql-server - 如何在 SQL Server 中创建是/否 boolean 字段?

java - 2 的倍数的 boolean 表达式

c# - 更好地理解 C# 泛型

c# - 为什么我的 Kendo AutoComplete 小部件没有绑定(bind)到 JSON 对象?

c# - .NET WinForms 多线程行为 : Setting property value in ThreadPool. QueueUserWorkItem 尽管有异常