【问题标题】:Database records added to top of table instead of bottom using LINQ使用 LINQ 将数据库记录添加到表顶部而不是底部
【发布时间】:2009-07-19 17:16:39
【问题描述】:

您好,我目前有一个程序可以检索 WMI 信息并将其存储到数据库中,然后在一段时间后删除较旧的记录。目前,我正在让我的程序删除超过 10 分钟的记录,并在用新信息填充数据库后每 2 分钟检查一次。在另一个每 2 分钟运行一次的计时器中,将存储在数据库中的信息显示给用户,其显示顺序与它在数据库表中出现的顺序相同。

当程序在 10 分钟后删除记录时从新数据库运行时,我遇到的问题发生了,而不是将新记录添加到数据库表的末尾,它们显示在顶部。当一些旧数据被删除后重新打开程序时,也会发生这种情况。

下面我添加了显示我的数据如何添加到数据库以及如何删除的代码(这发生在 2 个单独的类中)。在此之下,我包含了一些示例输出数据,以便您理解我的意思。

基本上我需要一种方法来解决这个问题,因为数据需要按照基于 DateTime 收集的顺序显示,所以如果你能发现任何东西,我将不胜感激,如果不是,解决这个问题的最佳方法是数据显示前排序?

DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0));

var result2 = (from b in hddInfo
               where b.DateTime < dateTime
               select b).DefaultIfEmpty();

foreach (TblHDDInfo record2 in result2)
{
        if (record2 != null)
        {
        localDB.TblHDDInfo.DeleteOnSubmit(record2);
        }
}

localDB.SubmitChanges();

TblHDDInfo hddInfoAdd = new TblHDDInfo();
                            hddInfoAdd.DeviceID = deviceID;
                            hddInfoAdd.IpAdd = ipAdd;
                            hddInfoAdd.Size = size;
                            hddInfoAdd.FreeSpace = freeSpace;
                            hddInfoAdd.DateTime = dateTime;
                            localDB.TblHDDInfo.InsertOnSubmit(hddInfoAdd);

                            localDB.SubmitChanges();

第一次 硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:27:21

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:29:26

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:31:31

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:33:36

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:35:41

第二次 硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:37:46

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:29:26

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:31:31

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:33:36

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:35:41

第三次 硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:39:51

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:37:46

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:29:26

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:31:31

硬盘大小:186GB 剩余空间:157GB 日期时间:19/07/2009 17:33:36

【问题讨论】:

    标签: c# database linq sorting


    【解决方案1】:

    为什么不直接将 orderby b.DateTime 添加到您的 LINQ 查询中?

    只是澄清一下:数据库本质上是无序的,插入的位置是不确定的,因为实际表中行的位置在您在交互时使用的抽象级别是一个毫无意义的概念您针对数据库的代码。您必须按一个或多个字段对 DB 输出进行排序才能应用排序。

    【讨论】:

    • 干杯我对 C# 和 LINQ 还很陌生,没想到,很抱歉成为 n00b
    【解决方案2】:

    我不能 100% 确定您要完成什么,因为数据库表没有“顶部”和“底部”。但是,这行代码……

    hddInfoAdd.DateTime = dateTime;
    

    ... 对我来说似乎是错误的。不应该是这样吗……

    hddInfoAdd.DateTime = DateTime.Now;
    

    【讨论】:

    • 是的,对不起,我之前收集了日期时间,它适用于所有记录
    【解决方案3】:

    DB 理论的核心内容之一是数据未排序存储。这个想法是人们可能希望通过多种方式对数据进行排序,因此对原始存储应用特定的排序顺序是浪费的。 DBMS 按插入的顺序显示未排序的数据只是一个意外/实现细节(我也见过这种情况并不总是如此)。

    如果您希望数据具有特定的顺序,则应使用 order by 子句(以及可能的索引)明确地应用该愿望。

    【讨论】:

      【解决方案4】:

      SQL 中唯一的顺序是您根据列值使用 ORDER BY 强加的顺序。

      所有其他明显的行顺序都是重合的。

      如果您想控制出现的顺序,那么您必须添加列来控制它并在您的 SELECT 上使用 ORDER BY 来实现它。如果您已经拥有列 (dateTime),那么您只需添加 ORDER BYs

      【讨论】:

        猜你喜欢
        • 2015-03-09
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2019-02-10
        相关资源
        最近更新 更多