C# 条件语句总是正确的

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)

仅当正在绑定的对象的属性与数据库中已有的记录匹配时,才应执行以下if语句:

[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))
。我想这更清楚了吧?:)