【问题标题】:Checking if Var from LINQ query is Null and returning values older than x检查来自 LINQ 查询的 Var 是否为 Null 并返回早于 x 的值
【发布时间】:2009-07-19 15:12:24
【问题描述】:

大家好,我目前对以下代码有 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();
        }
    }
    

【问题讨论】:

    标签: c# linq datetime error-handling


    【解决方案1】:

    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();
    

    现在,至于为什么

    DateTime tenMinutesAgo = DateTime.UtcNow.AddMinutes(-10);
    

    如果这仍然不起作用,我建议您查看生成的查询并在 SQL 工具(例如 Enterprise Manager 或 SQL Server Management Studio)中使用它,以找出它没有返回任何结果的原因。

    【讨论】:

    • @Jon: 使用 UTC 时间比本地时间有什么优势?
    • 这取决于数据库在什么位置,以及正在进行什么转换。具体情况将决定使用哪种形式正确。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多