【发布时间】:2020-11-05 16:48:46
【问题描述】:
我正在尝试创建一个唯一的随机数。如果数据库中存在随机数,则再次循环该代码块,直到找到不存在的数字。将值保存到数据库。对此的任何帮助都会很棒。谢谢。
public IHttpActionResult BookMatch(int id)
{
Guid guid = Guid.NewGuid();
var user = User.Identity.GetUserId();
var getuser = db.AspNetUsers.Find(user);
var match = db.Matches.Find(id);
Random rnd = new Random();
var peg = rnd.Next(match.PegRangeMin, match.PegRangeMax);
var alreadyExists = db.Pegs.Any(x => x.MatchId == match.Id && x.PegNo == peg);
if (alreadyExists == true)
{
//do something
}
var result = new Booked()
{
MatchId = id,
BookerId = user,
TicketNo = guid.ToString(),
//pegNo = randompeg
};
db.Bookeds.Add(result);
db.SaveChanges();
if (result == null)
{
throw new Exception();
}
var getmatch = db.Matches.Find(id);
var body = "<p>Email From: {0} ({1}) </p>" +
"<h3>Match Booking Confirmation:</h3>" +
"<b>Ticket Number:</b><p> {2} </p>" +
"<b>Venue:</b><p> {3} </p>" +
"<b>date and time:</b><p>{4}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress(getuser.Email));
message.From = new MailAddress("nicholas.mciver@Activeplan.co.uk");
message.Subject = "Matchbooker Confirmation Email";
message.Body = string.Format(body, getuser.GetFullName(), getuser.Email,
result.TicketNo, getmatch.Fishery.Name, getmatch.DateTime);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
smtp.Send(message);
}
return Ok();
}
【问题讨论】:
-
你可以做一个递归函数(一个调用自己的函数)。生成一个数字并检查数据库。如果生成的数字存在于数据库中,请递归调用您的函数。如果不存在,可以插入到DB中,退出函数。
-
你要么循环要么使用递归(就像@NolanBradshaw 建议的那样)。目前你抛出一个异常,这将阻止重试。
-
如果在您确定某个号码仍然可用之后,另一个用户添加了这个号码,您将参加比赛。根据您使用的 DBMS,使用存储过程可能会更好。
标签: c# asp.net-mvc random