0

我有一个包含大约 300 万条记录的数据库,每条记录都有 id(int,主键)、uniqueNumber(int)和 updateTime(string)。

uniqueNumber 可以属于多个记录。updateTime 表示一天中记录更新的时间,例如 14:33:42

编辑:记录按更新时间排序。

我想让用户定义一个 uniqueNumber 和一个间隔。然后我想查询数据库以获取属于该 uniqueNumber 的所有记录,其中它们的 updateTime 等于一个变量,每次 where 条件为真时,它的值都会按间隔增加。

例如,我想要这样的东西:(这个例子中没有使用数据库)

    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 回答