2011-05-09 67 views
0

我对LINQ相当陌生,因此对于你们中的某些人来说,这可能是一个简单易用的解决方案。我一直在抓我的头发已经有一段时间了:)LINQ获得最新的条目

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

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

的时间是excatly上的读数为特定模块一样,所以我想象我由是恒定的,然后就获得最新的数据能集团。 这是我到目前为止有:

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. 这有意义吗?如果没有,请让我尝试再次解释。

做一个>获得最大总和是行不通的,因为我也有触发布尔值的状态。一种意思是机器上有报警,零表示一切正常。

我很抱歉双后。无论出于何种原因,我的临时帐户被锁定,我无法对我的旧帖子发表评论。现在我已注册,希望能够提供更多信息。假设在模块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个查询,我得到了我想要的。我确信这可以使用一个查询来解决,但我远不是一个硬核程序员,可以指出这一点。

+0

从我所看到的'LatestObjects'已经有你想要的,其他的查询不会做任何更多的东西。 – Magnus 2011-05-09 12:43:32

+0

顶一个不会返回任何magnus :),它只是在那里颠倒表,并获得最新的时间输入。 – 2011-05-10 06:16:24

回答

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 
+0

谢谢法德里安,我对所有的lambda表达式都不太满意。希望我会有一天:) – 2011-05-10 06:18:50

+0

我会接受它,因为我确定它会工作,但为了更好地理解,我使用我自己的代码得到我想要的。 – 2011-05-10 13:41:08