0

約 300 万のレコードを持つデータベースがあり、各レコードには id (int、主キー)、uniqueNumber(int)、および updateTime(string) があります。

uniqueNumber は複数のレコードに属することができます。updateTime は、レコードが更新された時刻を表します (14:33:42 など)。

編集: レコードは更新時間順に並べられています。

ユーザーに uniqueNumber と interval を定義させたい。次に、DB にクエリを実行して、その uniqueNumber に属するすべてのレコードを取得します。その updateTime は、where 条件が true になるたびに値が間隔で増加する変数に等しくなります。

たとえば、次のようなものが必要です: (この例では DB は使用されていません)

    string currentTime = "12:25:00";
    int interval = 2;

    public void LinqExample()
    {
        string[] arr = new string[4] { "12:23:00", "12:26:00", "12:27:00", "12:28:00"};

        var query = from c in arr
                    where c.Replace(":", "").CompareTo(currentTime.Replace(":", "")) > 0 && Inc()
                    select c;

        // query's output is: "12:26:00", "12:28:00"
    }

    private bool Inc()
    {
        currentTime = DateTime.Parse(currentTime).AddMinutes(interval).ToLongTimeString();
        return true;
    }

私のコードはこれを行う適切な方法ですか?

ありがとう!

4

2 に答える 2

1

必要なのは、オフセットを使用したモジュロ演算です。現在の時刻と記録された時刻の分単位の差は整数です。その整数が間隔値で割り切れる場合は、一致しています。

(Entity Framework を想定し、linq-to-sql では SqlMethods を使用)

var now = DateTime.Now;
var curr = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0);

var query = context.Table
.Where(t => t.uniqueNumber == uniqueNumber
.Where(t => t.updateTime > curr) 
.Where (t => EntityFunctions.DiffMinutes(curr, t.updateTime) % interval == 0)
.Select (t => new { t.updateTime, .... } )
于 2012-09-20T17:39:11.400 に答える
1

必要なコードが存在する場合はCURSOR、EF によってテーブルに対して SQL クエリを生成する必要があるようです。ただし、私が質問したように、EF はカーソルを含むコードを生成しないため、LINQ を使用して問題を解決することはできません。私見これを行う唯一の方法は、このようなテーブル値関数を書くことです

CREATE FUNCTION GetTimesByUniqueNumberWithIntervalAndCondition
(
    @interval int, @uniqueNumber int,@currentTime time
)
RETURNS 
@Times TABLE 
(
    t char(10)
)
AS
BEGIN
    DECLARE timeCursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
    SELECT updateTime FROM Table2 WHERE uniqueNumber = @uniqueNumber
    ORDER BY updateTime 

    DECLARE @t char(10);

    OPEN timeCursor
    FETCH NEXT FROM timeCursor INTO @t;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF 
            1 = 1 -- place your condition here
        BEGIN
            INSERT @Times(t) VALUES(@t)
            SET @currentTime = DATEADD(MINUTE,@interval,CAST(@t AS time))
        END

        FETCH NEXT FROM timeCursor INTO @t;
    END

    CLOSE timeCursor
    DEALLOCATE timeCursor

    RETURN 
END
GO

選択が必要になるたびに、この関数に対してクエリを実行します。

于 2012-09-21T12:26:34.383 に答える