我对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值的状态。一个意味着机器上有一个报警,零表示一切正常。
我很抱歉这篇双职位。无论出于何种原因,我的临时帐户被锁定,我无法评论我的旧帖子。现在我已注册,希望能够提供更多信息。
@Jon Skeet,这是模块0B上有2个活动端口的设置,想象一下模块0B端口1上有一个激活的报警,然后即使问题已经解决,我仍然会显示过时的数据。 / p>
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个查询,我得到了我想要的东西。我确信这可以通过一个查询来解决,但我还远远不能成为一个能够解决这个问题的核心程序员。
答案 0 :(得分: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