我对 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。这有意义吗?如果没有,请让我尝试再次解释。
做一个>来获得最大的总和是行不通的,因为我也有触发布尔值的状态。一个表示机器上有警报,零表示一切正常。
我很抱歉双重帖子。无论出于何种原因,我的临时帐户都被锁定了,我无法对我的旧帖子发表评论。现在我已经注册了,希望能够提供更多信息。
@Jon Skeet,这是模块 2B 上具有 0 个活动端口的设置,想象一下模块 0B 端口 1 上有一个警报处于活动状态,那么即使问题已解决,我仍然会显示过时的数据。
https://i.stack.imgur.com/oX1ZK.jpg
以下是我的客户端的外观:
https://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 个查询,我得到了我想要的。我相信这可以通过一个查询来解决,但我远不是一个铁杆程序员,可以解决这个问题。
你在那里所做的是正确的。 您可以通过在代码中将 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