.StartsWith和.Contains在比较日期时返回null

时间:2015-03-13 18:27:28

标签: c# sql asp.net-mvc linq

在我的应用程序中,我试图在特定时间段内提取特定列中的值的总和。例如,如果我希望它每个月都能得到这笔钱,我会做这样的事情

var thisDate = DateTime.Now;
var currentDay = thisDate.Day;
var thisMonth = DateTime.Now.ToString("MM");
var thisYear = thisDate.Year.ToString();
var thisYearthisMonth = string.Format("{0}-{1}", thisYear, thisMonth);
var SpecifiedTotal = (from t in db.Transaction
                      where t.AgentId == CurrentUser.SalesAgent.AgentId
                      && t.Status.Status == "Approved"
                      && t.DateApproved.ToString().StartsWith(thisYearthisMonth)
                      select (decimal?)t.AmountApproved).Sum() ?? 0;

设置断点向我显示SpecifiedTotal正在评估为零。我试图找出原因,删除行&& t.DateApproved.ToString().Contains(thisYearthisMonth)并将其评估为正确的值。从本质上讲,我试图在3月份的时间段中取出一列中的值的总和,即2015-03,所以我想通过查找从2015-03开始的任何日期来比较存储的日期是有意义的。我怎么可能做错了?

2 个答案:

答案 0 :(得分:4)

如果没有尝试确切地解决此问题,我会强烈建议不要使用字符串表示来进行此类操作。只需使用DateTime比较 - 当然假设DateApprovedDateTime列。 (如果不是,那就这样吧!)

var thisDate = DateTime.Now;
var start = new DateTime(thisDate.Year, thisDate.Month, 1);
var end = start.AddMonths(1);
var specifiedTotal = (from t in db.Transaction
                      where t.AgentId == CurrentUser.SalesAgent.AgentId
                      && t.Status.Status == "Approved"
                      && t.DateApproved >= start && t.DateApproved < end
                      select (decimal?)t.AmountApproved).Sum() ?? 0;

通常,除非您实际对文本感兴趣,否则应避免使用字符串操作。在这种情况下,您不是 - 您正在尝试在日期上执行范围比较。这与它们的文本表示无关。

答案 1 :(得分:0)

因为StartsWith是一个比Contains更严格的匹配?您是否尝试过检查DateApproved的格式?