0

C#で特定の間隔でデータベースから値をフェッチしたいのですが、そのためのLINQクエリが必要です。これは私のデータベースがどのように見えるかです

Id      SensorId  Value       CreatedOn   

1         8        33.5       15-11-2012  5:48 PM     
2         5        49.2       15-11-2012  5:48 PM 
3         8        33.2       15-11-2012  5:49 PM
4         5        48.5       15-11-2012  5:49 PM
5         8        31.8       15-11-2012  5:50 PM  
6         5        42.5       15-11-2012  5:50 PM  
7         8        36.5       15-11-2012  5:51 PM  
8         5        46.5       15-11-2012  5:51 PM  
9         8        39.2       15-11-2012  5:52 PM  
10        5        44.4       15-11-2012  5:52 PM  
11        8        36.5       15-11-2012  5:53 PM  
12        5        46.5       15-11-2012  5:53 PM  
13        8        39.2       15-11-2012  5:54 PM  
14        5        44.4       15-11-2012  5:54 PM  
..        .        ....       ...................

間隔は分単位です。したがって、間隔が10分である場合、5:48、5:58、6:08などの値が必要です...

これは私が試したことです

while (startDateTime <= endDateTime)
            {
               var fetchIndex =
                    fullValues.Where(
                        item =>
                        item.CreatedOn >= startDateTime &&
                        item.CreatedOn < startDateTime.AddMinutes(1)).Select(
                            item => item.FetchIndex).FirstOrDefault();
                if (fetchIndex != 0)
                {
                    var temp = fullValues.Where(item => item.FetchIndex == fetchIndex).ToList();
                    result = result.Union(temp);
                }

                startDateTime = startDateTime.AddMinutes(interval);
            }

whileループはテーブルを反復処理するため、これらの値を取得するには多くの時間がかかります。

単一のクエリでデータを取得する方法はありますか?

4

2 に答える 2

2

次のアプローチでは、 とrequiredTimesの間の関連するすべての日時を保持するリストを作成します (開始日時startDateTimeendDateTime終了日時の間の 10 分間隔の日時)。そのようなリストが作成された後、そのfullValues上で内部結合されます。fullValues結果は、間隔条件を満たす日時からの IEnumerableです。このようなリストの作成は迅速であり、Joinメソッドも高速に動作する内部結合であるため、高速に動作するはずです。試してみてください。

        DateTime startDateTime = DateTime.Parse("15-11-2012 5:48 PM");
        DateTime endDateTime = DateTime.Parse("16-11-2012 5:58 PM");

        List<DateTime> requiredTimes = new List<DateTime>();

        DateTime dt = startDateTime;
        requiredTimes.Add(dt);
        while (dt <= endDateTime)
        {
            dt = dt.AddMinutes(10);
            requiredTimes.Add(dt);
        }

        var result = fullValues.Join(
            requiredTimes,
            fv => fv.CreatedOn,
            rt => rt,
            (fv, rt) => fv);
于 2012-11-29T07:36:19.483 に答える
2
from x in table
where   x.CreatedOn >= startDateTime &&
        x.CreatedOn <= endDateTime &&
        (x.CreatedOn.Minute % 10) == 0
select x

これにより、1:00、1:10、1:20が得られます

10 は間隔を表し、0 はオフセットです。

于 2012-11-29T07:06:24.247 に答える