Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#查询值更改后选择第一个_C#_Sql Server - Fatal编程技术网

C#查询值更改后选择第一个

C#查询值更改后选择第一个,c#,sql-server,C#,Sql Server,我有一个如下所示的数据库表: 现在。这是检测器ID的状态历史指示器 我只想在我的网站上显示一行。为此,我执行以下查询 [Query] public IQueryable<ScannerStatusHistory> GetScannerStatusHistoryy(int detectorID) { return ObjectContext.ScannerStatusHistories.Where(t => t.DetectorID == detectorID).Ord

我有一个如下所示的数据库表:

现在。这是检测器ID的状态历史指示器

我只想在我的网站上显示一行。为此,我执行以下查询

[Query]
public IQueryable<ScannerStatusHistory> GetScannerStatusHistoryy(int detectorID)
{
    return ObjectContext.ScannerStatusHistories.Where(t => t.DetectorID == detectorID).OrderByDescending(d => d.TimeStamp).Take(1); ;
}
[查询]
公共IQueryable GetScannerStatusHistory(int detectorID)
{
返回ObjectContext.ScannerStatusHistories.Where(t=>t.DetectorID==DetectorID).OrderByDescending(d=>d.TimeStamp).Take(1);
}
因此,它所做的就是获取最新的行(基于时间戳),并显示它

这将给我ScannerStatusHistoryID 61的结果

但是,我想要的是上一次更改值的行

正如您在
ScannerStatusHistoryID 54
上看到的,
RC3
的值为
4
。然后在
ScannerStatusHistoryID 57上,它又变回
3

从那时起,这些值没有改变。
然后,我想要的是获取
扫描仪StatusHistoryID 57
的查询。直到值再次更改,然后我希望它获取该值的第一个


我如何做到这一点?我在考虑计算与上次查询匹配的结果。但是,在本例中,它将返回7个结果(因为前4个结果与后3个结果相同)。因此它不会给你正确的结果。

你可以这样写你的查询来实现它:

//return ObjectContext.ScannerStatusHistories.Where(t => t.DetectorID == detectorID).OrderByDescending(d => d.TimeStamp).Take(1);
    var lastRow = ObjectContext.ScannerStatusHistories.Where(t => t.DetectorID == detectorID).OrderByDescending(d => d.TimeStamp).FirstOrDefault();
//Get last changed row
    if (lastRow != null)
    {
        var lastChangeRow = ObjectContext.ScannerStatusHistories
        .Where(t => t.DetectorID == detectorID
                && (t.HBD1 != lastRow.HBD1 || t.HBD2 != lastRow.HBD2 || t.HWD1 != lastRow.HWD1 || t.HWD2 != lastRow.HWD2 || t.RC1 != lastRow.RC1 || t.RC2 != lastRow.RC2 || t.RC3 != lastRow.RC3 || t.RC4 != lastRow.RC4))
            .OrderByDescending(d => d.TimeStamp)
            .FirstOrDefault();
    //Return next row
        if (lastChangeRow != null)
        {
            return ObjectContext.ScannerStatusHistories
            .Where(x => lastChangeRow.TimeStamp < x.TimeStamp
                && x.DetectorID == detectorID)
            .OrderBy(d => d.TimeStamp)
            .Take(1);
        }
    }
return ObjectContext.ScannerStatusHistories.Where(t => t.DetectorID == detectorID).OrderBy(d => d.TimeStamp).Take(1);
//返回ObjectContext.ScannerStatusHistories.Where(t=>t.DetectorID==DetectorID).OrderByDescending(d=>d.TimeStamp).Take(1);
var lastRow=ObjectContext.ScannerStatusHistories.Where(t=>t.DetectorID==DetectorID).OrderByDescending(d=>d.TimeStamp).FirstOrDefault();
//换行
if(lastRow!=null)
{
var lastChangeRow=ObjectContext.ScannerStatusHistories
.其中(t=>t.DetectorID==DetectorID
&&(t.HBD1!=lastRow.HBD1 | t.HBD2!=lastRow.HBD2 | t.HWD1!=lastRow.HWD1 | t.HWD2!=lastRow.HWD2 | t.RC1!=lastRow.RC1 | t.RC2!=lastRow.RC2 | t.RC3 | t.RC4!=lastRow.RC4))
.OrderByDescending(d=>d.TimeStamp)
.FirstOrDefault();
//返回下一行
如果(lastChangeRow!=null)
{
返回ObjectContext.ScannerStatusHistories
.其中(x=>lastChangeRow.TimeStampd.TimeStamp)
.采取(1)项措施;
}
}
返回ObjectContext.ScannerStatusHistories.Where(t=>t.DetectorID==DetectorID).OrderBy(d=>d.TimeStamp.Take(1);

但是如果没有任何更改,最好不要添加行。

是否要控制所有
hwd
RC
列的值?或者
RC3
对你来说足够了?基本上,我现在得到的是最新的结果。然而,我不需要知道这一点,但我想知道它是什么时候改变的。自2012年以来,sql服务器有超前、滞后,这给了这个问题最简单的解决方法。是否可以直接使用usindsql?Net 4.6.1中的Linq不支持sql的分析函数。我们不能这样做(如果没有任何更改)。在本例中,系统每x分钟更新一次。不过,我会试试你的解决方案。@Mitch你总是可以在MS SQL中的insert上设置一个触发器,在这里你可以检查一切是否相同。这是真的。但是,这是一个历史记录表。我们想得到系统发送的所有数据。如果我们只在数据更改时发送数据。我们不知道系统是否在其他x天运行。@Mitch ok解决它的另一种方法是在表中添加
LastChangeTimeStamp
,并将所有比较逻辑放在那里。也许会干净一点。此外,如果您的表有点小,您总是可以在该列上放置索引。@Mitch因为您需要一行,所以请使用
.FirstOrDefault()
而不是
Take(1)