使用LINQ to Entities选择连续的条目

kno*_*oia 6 linq database linq-to-entities

我有一个数据库表,每行包含一个顺序索引.我想根据此索引列选择连续的行组.例如,如果我有包含以下索引值的行:

1
3
4
5
7
9
10
11
12
15
16
Run Code Online (Sandbox Code Playgroud)

我想选择所有具有3个连续索引的组(此数字会有所不同).我会得到以下几组:

3, 4, 5

9, 10, 11

10, 11, 12
Run Code Online (Sandbox Code Playgroud)

基本上,我正在努力实现类似于此处提出的问题:

使用SQL查询选择连续的数字

但是,我想用LINQ to Entities实现它,而不是实际的SQL.我也不想使用存储过程,我不想做任何类型的ToList /循环方法.

编辑:具有多个请求的连续元素的组不一定需要拆分.即,在前面的例子中,9,10,11,12的结果也是可以接受的.

Alb*_*nbo 0

using (var model = new AlbinTestEntities())
{
    var triples = from t1 in model.Numbers
                  from t2 in model.Numbers
                  from t3 in model.Numbers
                  where t1.Number + 1 == t2.Number
                  where t2.Number + 1 == t3.Number
                  select new
                  {
                      t1 = t1.Number,
                      t2 = t2.Number,
                      t3 = t3.Number,
                  };

    foreach (var res in triples)
    {
        Console.WriteLine(res.t1 + ", " + res.t2 + ", " + res.t3);
    }
}
Run Code Online (Sandbox Code Playgroud)

它会生成以下 SQL

SELECT 
[Extent1].[Number] AS [Number], 
[Extent2].[Number] AS [Number1], 
[Extent3].[Number] AS [Number2]
FROM   [dbo].[Numbers] AS [Extent1]
CROSS JOIN [dbo].[Numbers] AS [Extent2]
CROSS JOIN [dbo].[Numbers] AS [Extent3]
WHERE (([Extent1].[Number] + 1) = [Extent2].[Number]) AND (([Extent2].[Number] + 1) = [Extent3].[Number])
Run Code Online (Sandbox Code Playgroud)

使用这样的内连接可能会更好

using (var model = new AlbinTestEntities())
{
    var triples = from t1 in model.Numbers
                  join t2 in model.Numbers on t1.Number + 1 equals t2.Number
                  join t3 in model.Numbers on t2.Number + 1 equals t3.Number
                  select new
                  {
                      t1 = t1.Number,
                      t2 = t2.Number,
                      t3 = t3.Number,
                  };

    foreach (var res in triples)
    {
        Console.WriteLine(res.t1 + ", " + res.t2 + ", " + res.t3);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我在管理工作室中比较生成的查询时,它们生成相同的执行计划并花费完全相同的时间来执行。我只有这个有限的数据集,如果数据集较大,您可以比较数据集的性能,如果数据集不同,则选择最好的。