C# C语言中的非对称函数等价#

C# C语言中的非对称函数等价#,c#,linq,tsql,C#,Linq,Tsql,我需要在C#Linq中实现以下SQL: 我找不到任何类似问题的答案,除了。然而,我不认为这是我正在寻找的 我甚至不知道从哪里开始,如果有人能给我至少一个起点,我很感激 --编辑-- 试着更好地解释一下。 我有一个存储X,其中包含从SQL检索的事务、项目、单位和其他数据,并存储在C#中的一个对象中 我有一个包含相同数据的所有存储的列表,但在本例中,由于检索到的数据量很大(以及其他原因),我从Analysis Services中检索到它,并将其全部存储在C#中的另一个对象中 所以我需要的是对列表进行

我需要在C#Linq中实现以下SQL:

我找不到任何类似问题的答案,除了。然而,我不认为这是我正在寻找的

我甚至不知道从哪里开始,如果有人能给我至少一个起点,我很感激

--编辑--

试着更好地解释一下。 我有一个存储X,其中包含从SQL检索的事务、项目、单位和其他数据,并存储在C#中的一个对象中

我有一个包含相同数据的所有存储的列表,但在本例中,由于检索到的数据量很大(以及其他原因),我从Analysis Services中检索到它,并将其全部存储在C#中的另一个对象中

所以我需要的是对列表进行排序,并确定存储X是在列表的前四分之一位,还是第二位或第三位

我希望这有助于澄清我试图实现的目标


谢谢

您可以使用
GroupBy
功能,根据对象的索引进行分组。考虑这样的整数列表:-

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };

我相信没有简单的LINQ等价于
NTILE(n)
。不管怎样,根据你的需要,写一本并不难

T-SQL文档说

将有序分区中的行分配到指定数量的组中。分组编号,从一开始。对于每一行,NTILE返回该行所属组的编号

(见附件)

对于
NTILE
的非常粗糙的实现,可以使用
GroupBy
。为了简单起见,下面的示例使用了
int[]
,但您当然不限于

int n = 4;
int[] data = { 5, 2, 8, 2, 3, 8, 3, 2, 9, 5 };
var ntile = data.OrderBy(value => value)
                .Select((value,index) => new {Value = value, Index = index})
                .GroupBy(c => Math.Floor(c.Index / (data.Count() / (double)n)), c => c.Value);
首先,我们的
数据
按其值升序排列。如果您不使用simple
int
s,那么这可能类似于
store=>store.Revenue
(假设您希望通过商店的收入获得分位数)。此外,我们还将有序数据选择为匿名类型,以包含索引。这是必要的,因为索引是分组所必需的,但似乎
GroupBy
不支持带有索引的lambda,就像
Select
一样

第三行不太直观,但我会尝试解释:
NTILE
函数分配组,行分配给。为了创建
n
组,我们通过
n
n
(项目数)划分为
n
,以获得每组的项目,然后根据该值设置当前索引,以确定当前项目在哪个组中。为了得到正确的组数,我必须使每组的项目数为分数,并使计算出的组数最低,但不可否认,这是相当经验性的

ntile
将包含
n个
组,每个组的
等于组号。每个组都是可枚举的。如果要确定某个元素是否在第二个四分位数中,可以检查
组。其中(g=>g.Key==1)
包含该元素


备注:我用于确定组的方法可能需要一些微调。

您的第一步是阅读文档()。据我所知,LINQ没有实现NTILE函数,因此您必须自己运行。您想要/需要什么还不太清楚。您需要原始对象的组数吗?也许你可以提供一个用例或者更详细地描述你需要什么。
var result = numbers.Select((v, i) => new { Value = v, Index = i / 3 })
                    .GroupBy(x => x.Index)
                    .Select(x => x.Select(z => z.Value).ToList());
int n = 4;
int[] data = { 5, 2, 8, 2, 3, 8, 3, 2, 9, 5 };
var ntile = data.OrderBy(value => value)
                .Select((value,index) => new {Value = value, Index = index})
                .GroupBy(c => Math.Floor(c.Index / (data.Count() / (double)n)), c => c.Value);