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)
基本上,我正在努力实现类似于此处提出的问题:
但是,我想用LINQ to Entities实现它,而不是实际的SQL.我也不想使用存储过程,我不想做任何类型的ToList /循环方法.
编辑:具有多个请求的连续元素的组不一定需要拆分.即,在前面的例子中,9,10,11,12的结果也是可以接受的.
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)
但是当我在管理工作室中比较生成的查询时,它们生成相同的执行计划并花费完全相同的时间来执行。我只有这个有限的数据集,如果数据集较大,您可以比较数据集的性能,如果数据集不同,则选择最好的。
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |