大家好,我目前遇到以下代码的2个问题:
返回result1后,我正在尝试检查它是否为!= null,如果不是,它将开始删除所选的记录。问题是,即使result1没有返回任何内容,默认情况下if语句也不会选择它,所以我想我错过了什么但是什么?
我希望只返回超过10分钟的值(之后将缩放到12小时)来执行此操作我正在检查a.DateTime,它是存储在数据库中的DateTime值。但是,如果我使用< =或> =运算符,那么它不会再次起作用我错过了什么?
DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0));
var result1 = (from a in cpuInfo
where a.DateTime <= dateTime
select a).DefaultIfEmpty(null);
if (result1 != null)
{
foreach (TblCPUInfo record1 in result1)
{
localDB.TblCPUInfo.DeleteOnSubmit(record1);
localDB.SubmitChanges();
}
}
答案 0 :(得分:5)
Philippe谈到了事情的序列方面 - 尽管你甚至不需要调用Any()
。毕竟,如果没有变化,循环就不会做任何事情。
您真的想在每次迭代时提交更改吗?最后一次这样做可能更有意义。此外,您可以使用DateTime.AddMinutes
使“10分钟前”初始化更简单,如果您只使用Where
子句进行过滤,则使用点表示法。
在完成所有这些更改(并使变量名称更有用)之后,代码将如下所示:
DateTime tenMinutesAgo = DateTime.Now.AddMinutes(-10);
var entriesToDelete = cpuInfo.Where(entry => entry.DateTime <= tenMinutesAgo);
foreach (var entry in entriesToDelete)
{
localDB.TblCPUInfo.DeleteOnSubmit(entry);
}
localDB.SubmitChanges();
现在,至于为什么&lt; =不适合你......你是否可能需要UTC时间而不是当地时间?例如:
DateTime tenMinutesAgo = DateTime.UtcNow.AddMinutes(-10);
如果仍然无法正常工作,我建议您查看生成的查询并在SQL工具(例如企业管理器或SQL Server Management Studio)中使用它来解决为什么它不会返回任何结果。< / p>
答案 1 :(得分:3)
DefaultIfEmpty将返回包含您提供的内容的单个项目,因此在您的情况下,具有单个值“null”的集合。
您应该使用Any()扩展方法检查集合中的元素。在你的情况下:
DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0));
var result1 = from a in cpuInfo
where a.DateTime <= dateTime
select a;
if (result1.Any())
{
foreach (TblCPUInfo record1 in result1)
{
localDB.TblCPUInfo.DeleteOnSubmit(record1);
localDB.SubmitChanges();
}
}
但如果这确实是你的代码,你可以完全跳过Any()检查,因为如果result1中没有元素,foreach循环将不会运行。