List.Max(x => x.ID)不行

时间:2012-05-12 15:17:34

标签: c# list asp.net-membership max

我有一个表,其中有一个名为ID_client的属性,其中是主键。我必须从此属性中搜索最大值并执行+1以分配给新客户端。我有以下代码..

public int IDuser()
    {

        MembershipUserCollection iduser = Membership.GetAllUsers();

        foreach (MembershipUser member in iduser)
        {

            UserEntity entity = new UserEntity();
            entity.Username = member.UserName;
            entity.Roles = "Users";
            entity.Email = member.Email;
            for (int i = 1; i <=iduser.Count; i++)
            {
                entity.ID_client = i;
            }
            _entities.Add(entity);

        }

        int maxID = _entities.Max(x => x.ID_client) +1;

        return maxID;

    }

如果我创建,例如,四个用户都可以,1,2,3和4.但如果我删除第三个用户,我有1,2和4作为ID_client,和下一个新用户,我想赋值5,但是这个函数返回4,而不是5.就像函数做一个count + 1而不是最大值+1。

有人可以帮助我吗?

感谢。

4 个答案:

答案 0 :(得分:3)

您的代码会重置所有实体上的ID_client。因此,如果删除一个用户,剩下的用户将ID_client设置为1,2,3或4.因此List.Max()正确返回4

答案 1 :(得分:2)

您为方法指定的名称并不反映该方法应该执行的操作。给它说一个名字。我没有看到内循环应该做什么。算了吧。在添加新记录之前获取最大ID。也许你想要这样的东西

public int CopyMembershipUsersToUserEntities()
{
    int lastID = _entities.Max(x => x.ID_client); 
    foreach (MembershipUser member in Membership.GetAllUsers()) 
    { 
        UserEntity entity = new UserEntity(); 
        entity.Username = member.UserName; 
        entity.Roles = "Users"; 
        entity.Email = member.Email; 
        entity.ID_client = ++lastID; 
        _entities.Add(entity); 
    } 
    return lastID; 
} 

正如其他人已经说过的那样,您也可以使用自动增量列。这在多用户环境中更安全。

答案 2 :(得分:1)

在数据库级别启用字段“ID”的自动递增 - 所有代码都将是多余的。

答案 3 :(得分:0)

很奇怪,但我已经解决了我的错误......

在存储membershipUsser之前,我将其存储在列表中..

            uentity.Username = username;
            for(int i=1;i<1000;i++) 
            {
                uentity.ID_client = i;
            }
            _entities.Add(uentity);

然后创建一个MembershipUser ..

      userDataSource.Insert(new UserEntity(
      GetPartitionKeyFromUsername(username).ToString(),
      String.Empty)
            {
                Username = username,
                Password = EncodePassword(password),
                CreationDate = DateTime.Now,
                IsDeleted = DefaultValues.IsDeleted,
                IsLockedOut = DefaultValues.IsLockedOut,
                IsApproved = DefaultValues.IsApproved,
                ApplicationName = applicationName,
                Email = email,
                PasswordQuestion = passwordQuestion,
                PasswordAnswer = passwordAnswer,
                Gender = DefaultValues.Gender,
                LastProfileUpdatedDate = DateTime.Now,
                LastActivityDate = DateTime.Now,
                LastPasswordChangedDate = DateTime.Now,
                LastLoginDate = new DateTime(1970, 1, 1),
                LastLockedOutDate = new DateTime(1970, 1, 1),
                FailedPasswordAttemptWindowStart = new DateTime(1970, 1, 1),
                FailedPasswordAnswerAttemptWindowStart = new DateTime(1970, 1, 1),
                Birthday = new DateTime(1970, 1, 1),
                Roles = Roles(username),
                ID_client = IDuser(username)
            });

并且总是给我一个自动增量ID的方法,因为如果我删除一个成员用户,我不会从列表中删除..

    public int IDuser(string username)
    {

        int lastID;

        if (username=="Admin")
        {
            lastID=1;

        }

        else
        {

            lastID = _entities.Count();
        }

        return lastID;
    }

但我有答案,我用

  lastID = _entities.Count();

而不是

  lastID = _entities.Max(x => x.ID_client)

因为第二个用户的_entities.Max给了我999,而不是数字2.它是给我剩余容量,而不是ID_client(2)的最大值。

有人可以告诉我为什么会这样?

感谢。