【发布时间】: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