C# 条件语句总是正确的
仅当正在绑定的对象的属性与数据库中已有的记录匹配时,才应执行以下if语句:C# 条件语句总是正确的,c#,if-statement,asp.net-mvc-5,conditional,C#,If Statement,Asp.net Mvc 5,Conditional,仅当正在绑定的对象的属性与数据库中已有的记录匹配时,才应执行以下if语句: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "ID,AID,Date,PostPreID")] OL oLevel) { if (ModelState.IsValid) { if(oLevel.PostPreID == 2)
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,AID,Date,PostPreID")] OL oLevel)
{
if (ModelState.IsValid)
{
if(oLevel.PostPreID == 2)
{
if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID))
{
ModelState.AddModelError("PostPreID", "There is already a record for this Date!");
return View(oLevel);
}
else
{
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
}
if(oLevel.PostPreID == 3)
{
if (db.OL.Any(x => DbFunctions.TruncateTime(x.Date) == DbFunctions.TruncateTime(oLevel.Date) && x.PostPreID == oLevel.PostPreID))
{
ModelState.AddModelError("PostPreID", "There is already a record for this Date!");
return View(oLevel);
}
else
{
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
}
db.OL.Add(oLevel);
db.SaveChanges();
return RedirectToAction("Index", new { id = oLevel.AID });
}
return View(oLevel);
}
基本上,如果数据库中已有一条记录,而该特定日期的PostPreID
为2,则用户不应添加该日期的PostPreID
等于2的记录。当PostPreID
等于3时,同样的逻辑也适用
我已经调试并在2和3中输入了PostPreID
的日期,因为我知道数据库不包含这些记录,但出于某种原因,包含.Any方法的嵌套if语句总是解析为true
非常感谢您的帮助。这个问题似乎与
DbFunctions.TruncateTime(x.Date)
有关。因此,TruncateTime
删除时间并仅比较两个日期,例如:
'4/11/2016 12:48 PM' == '4/11/2016 6:37 AM'
将评估为真实。这意味着,无论何时,只要日期和ID相同,
。任何
都将始终为真。您确定DbFunctions.TruncateTime
正确吗?另外,要调试此功能,请调用db.OL.FirstOrDefault
并将相同的表达式传递给它,以查看它看到的是您不期望的记录。共享DbFunctions.TruncateTime
@DavidPine的源代码它是EF@David的一部分老实说,我不确定DbFunctions.TruncateTime
是否正确。我使用它的唯一原因是b/c Date的类型是DateTime
,其中包含时间,但此条件语句不需要时间,因此我认为Db.Functions.TruncateTime
将删除记录和绑定属性的时间,只需比较日期。。你的意思是:如果(db.OL.FirstOrDefault(x=>DbFunctions.TruncateTime(x.Date)==DbFunctions.TruncateTime(oLevel.Date)和&x.PostPreID==oLevel.PostPreID))
?那么TruncateTime
删除时间并只比较两个日期,例如'4/11/2016 12:48 PM'='4/11/2016 6:37 AM'
就是真的!如果中有超过1个条件,这怎么可能是真的呢?我的意思是,如果数据库中的任何记录与oLevel
对象中绑定的内容具有相同的date
和postreid
,那么就发布一个错误。我不仅仅是比较日期。我的观点是这两个条件都是正确的,只是条件不够明确。日期(一旦截断)和ID都相同。确定。我在条件语句中添加了if(db.OL.Any(x=>DbFunctions.TruncateTime(x.Date)==DbFunctions.TruncateTime(oLevel.Date)&&x.PostPreID==oLevel.PostPreID&&x.AID==oLevel.AID))
。我想这更清楚了吧?:)