【问题标题】:LINQ getting the latest entriesLINQ 获取最新条目
【发布时间】:2011-05-09 09:36:06
【问题描述】:

我对 LINQ 还很陌生,所以这对你们中的一些人来说可能是一个简单的解决方案。我已经扯掉我的头发很长一段时间了:)

场景: 我有一个包含 3 个具有不同端口的硬件模块的盒子。 使用串行通信,我将模块中的数据提取到名为 CurrentData_Tables 的 SQL 表中 所以每次生产一个单位时,我的程序都会在表格中写入一个条目,说明总和有多大。 让我试着解释一下数据。

BoxID, ModuleID, PortNumber, Value,       Time
1,     0A,       1,          {Value},     {Date}

该特定模块的读数时间完全相同,所以我想我可以按恒定数据分组,然后获取最新的。 这是我目前所拥有的:

SQLdbDataContext sqlDB = new SQLdbDataContext();
BindingSource bs = new BindingSource();
var Latest = from q in sqlDB.CurrentData_Tabels
             group q by new
             {
                 q.BoxID,
                 q.ModuleID,
                 q.PortNumber,
                 q.Time
             }
             into groupOrder
             select new
             {
                 BoxID = groupOrder.Key.BoxID,
                 ModuleID = groupOrder.Key.ModuleID,
                 Portnumber = groupOrder.Key.PortNumber,
                 Time = groupOrder.Key.Time
             };

这很好,因为我得到了我想要的所有结果,甚至更多。我不需要知道模块 0A、端口 1 上的读数在最新输入 3 之前已计数为 2。 那有意义吗?如果不是,请让我再解释一次。

做一个 > 来获得最大的总和是行不通的,因为我也有触发 bool 值的状态。 1 表示机器上有警报,0 表示一切正常。

对于重复发帖,我深表歉意。无论出于何种原因,我的临时帐户都被锁定了,我无法评论我的旧帖子。现在我已注册,希望能够提供更多信息。

@Jon Skeet,这是模块 0B 上具有 2 个活动端口的设置,假设模块 0B 端口 1 上有一个活动警报,那么即使问题已经解决,我仍然会得到显示的过时数据。

http://i.stack.imgur.com/oX1ZK.jpg

这是我的客户端的外观:

http://i.stack.imgur.com/stBXY.jpg

显然我只想显示最新的数据。我希望这能消除混乱。


我似乎已经解决了我自己的问题,但以一种效率低下的方式。

SQLdbDataContext sqlDB = new SQLdbDataContext();

                    var LatestObjects = (from q in sqlDB.CurrentData_Tabels select q).OrderByDescending(x => x.Time).First();

                    var selectedobjects = from q in sqlDB.CurrentData_Tabels
                                          where q.Time == LatestObjects.Time
                                          select q;


                    dgvLiveData.DataSource = selectedobjects;
                    dgvLiveData.RowHeadersVisible = false;  

通过组合 2 个查询,我得到了我想要的。我确信这可以使用一个查询来解决,但我远不是一个能解决这个问题的铁杆程序员。

【问题讨论】:

  • 据我所知,LatestObjects 已经有了你想要的,其他查询没有做更多的事情。
  • 最上面的不会返回任何东西 magnus :),它只是用来把桌子倒过来并获取最新的时间条目。

标签: c# sql linq datagridview group-by


【解决方案1】:

你在那里做的是正确的。您可以通过在代码中将 latestquery 的语句作为子查询来编写它,但它没有任何不同。当您在代码中将查询设置为 LatestQuery 时,不会对服务器执行任何操作。实际提取是在查询中的数据被使用时完成的。

例子:

  var q = dc.Mytable.Where(e=>e.id > 5);    // q is IQueryable, no fetch to db is executed yet
  q = q.Where(e=> e.name.StartWith("a"));   // q is still IQueryable and no fetch yet too
  var list = q.List();   // Fetching of data to the db happens here

【讨论】:

  • 谢谢 Fadrian,我对所有的 lambda 表达式都不太擅长。希望有一天我会 :)
  • 我会接受它,因为我确信它会起作用,但为了更好地理解我正在使用我自己的代码来获得我想要的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多