检查来自LINQ查询的Var是否为Null并返回早于x的值

时间:2009-07-19 15:12:25

标签: c# linq datetime error-handling

大家好,我目前遇到以下代码的2个问题:

  1. 返回result1后,我正在尝试检查它是否为!= null,如果不是,它将开始删除所选的记录。问题是,即使result1没有返回任何内容,默认情况下if语句也不会选择它,所以我想我错过了什么但是什么?

  2. 我希望只返回超过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();
        }
    }
    

2 个答案:

答案 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循环将不会运行。