将从数据库检索的Null值转换为十进制数据类型

时间:2015-04-30 05:22:52

标签: c# linq entity-framework asp.net-mvc-4

请查看下表:

This is tblProfile

范围是:我必须在数据库中检查顶部 profileid ,并且必须将其增加1.如果没有数据那么它将获取 0 并且将会增加 1

当有数据时我得到最高值但是如果表是完全空的,我会得到例外。代码如下。

        public Decimal GetTopProfileID()
        {
            Decimal topID = 0;
            var profileID = _dbContext.tblProfile.Max(n => n.profileid);
            try
            {
                if (profileID == null)
                {
                    topID = 1;
                }
                else
                {
                    topID = Convert.ToDecimal(profileID);
                    topID++;
                }
            }
            catch (Exception)
            {
                throw;
            }
            return topID;
        }

请帮我找到解决方案。准备好任何问题。 在此先感谢!!

4 个答案:

答案 0 :(得分:2)

  

如果表格中没有记录,并且您尝试获取 .Max()值,   然后它会抛出一个错误,所以最好验证是否有任何记录   存在与否。

按如下方式更新您的代码。

if (_dbContext.tblProfile.Any()) {
    //Verify records in tblProfile table, if there's any record exist or not

    return Convert.ToDecimal(_dbContext.tblProfile.Max(n = > n.profileid)) + 1;
    try {
        if (profileID == null) {
            topID = 1;
        } else {
            topID = Convert.ToDecimal(profileID);
            topID++;
        }
    } catch (Exception) {
        throw;
    }

    return topID;
} else { //If there's no value in table then assuming it should return 1.
    return 1;
}

<强>更新

或者你可以让它更简单:

if (_dbContext.tblProfile.Any()) {
        //Verify records in tblProfile table, if there's any record exist or not

        return Convert.ToDecimal(_dbContext.tblProfile.Max(n = > n.profileid)) + 1;
    } else { //If there's no value in table then assuming it should return 1.
        return 1;
    }

答案 1 :(得分:0)

您可以使用此代码:

if (_dbContext.tblProfile.Any()) 
{
   //Verify records in tblProfile table, if there's any record exist or not
   var profileID = _dbContext.tblProfile.Max(n = > n.profileid) ?? 0;    

   return profileID + 1;
} 
else 
  return 1;

如果ProfileID不可为空,则不需要关心空值。

然后您可以使用以下代码:

return _dbContext.tblProfile.Any() ? _dbContext.tblProfile.Max(n = > n.profileid) + 1 : 1;

答案 2 :(得分:0)

          var profileID = _dbContext.tblProfile.OrderByDescending(n => n.profileid).FirstOrDefault();
  Decimal topID = 1;
                            if (profileID != null)
                            {
                             decimal.TryParse(profileID.ProfileId, out topID);
                             topID++;
                            }

                        return topID;
            }

Moksh Shah的回答是正确的,但在这种情况下,我们两次击中数据库, 我认为这应该产生预期的结果。

答案 3 :(得分:0)

像这样使用LastOrDefault()

decimal variableName = Convert.ToDecimal(_dbContext.tblProfile.Select(x=> x.ProfileId).LastOrDefault() + 1);

应该有效。

这比其他解决方案更好,因为只有一个数据库调用。