Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表中最常见的项目<;T>;然后再分类_C#_Sql_.net_Linq - Fatal编程技术网

C# 获取列表中最常见的项目<;T>;然后再分类

C# 获取列表中最常见的项目<;T>;然后再分类,c#,sql,.net,linq,C#,Sql,.net,Linq,我有一个对象/类的列表,该对象/类已经填充了来自SQL数据库的数据。我想做的是找出这个表中最常见的用户是谁,并根据最常见的用户对新列表进行排序 我不知道如何在Stackoverflow上设计一张桌子,所以你得忍受我 例如,数据库表可以如下所示: id - userID - randomColumn - randomColumn2 1 - 2 - ExampleText - ExampleText 2 - 2 - ExampleText - ExampleText 3 - 1 - ExampleT

我有一个对象/类的
列表
,该对象/类已经填充了来自SQL数据库的数据。我想做的是找出这个表中最常见的用户是谁,并根据最常见的用户对新列表进行排序

我不知道如何在Stackoverflow上设计一张桌子,所以你得忍受我

例如,数据库表可以如下所示:

id - userID - randomColumn - randomColumn2
1 - 2 - ExampleText - ExampleText
2 - 2 - ExampleText - ExampleText
3 - 1 - ExampleText - ExampleText
4 - 3 - ExampleText - ExampleText
5 - 2 - ExampleText - ExampleText
6 - 1 - ExampleText - ExampleText
我想使用LINQ或SQL对其进行格式化,以便得到如下列表

userID - amountColumn - randomColumn
2 - 3 - ExampleText
1 - 2 - ExampleText
3 - 1 - ExampleText

使用LINQ提供的
GroupBy
扩展方法

// Pseudo code
var grouped = list.GroupBy(item => item.UserID);
然后,您可以调用
OrderByDescending
对结果进行排序:

var sorted = grouped.OrderByDescending(group => group.Count());

您需要按
userID
对项目进行分组。然后,通过选择分组键、组中项目的计数和组中第一个项目的随机列的值,将每个组投影到匿名类型(或某些特定类型,如果您有)中。最后一步是按项目组的items count属性排序结果:

var query = list.GroupBy(u => u.userID)                  
                .Select(g => new {
                     userID = g.Key,
                     amountColumn = g.Count(),
                     randomColumn = g.First().randomColumn
                 }).OrderByDescending(x => x.amountColumn);

使用linq中的
GroupBy
方法按用户分组,然后按用户数排序,然后选择已排序的项目

var grouped = list.GroupBy(g => g.UserID)
                  .OrderByDescending(g => g.Count)
                  .Select(g => g);
如评论中所述,这将返回组列表。要将它们放入一个“平面”列表,您可以使用
SelectMany

var items = grouped.SelectMany(g => g);
项目将成为单个用户列表。

您需要以下功能:

users.GroupBy(n => n.userID)
   .Select(n => new {userID = n.Key, amountColumn = n.Count()})
   .OrderByDescending(n => n.amountColumn);
SQL将是:

SELECT userID, Count(UserID) AS Total , randomColumn
FROM YourTable
GROUP BY userID,randomColumn
ORDER BY Total

你试过了吗?你还需要一个
OrderBy
调用afterwords。你应该使用组的
Key
属性来访问键,而不是组中第一项的值。为什么
Select(g=>g)
?不知道为什么会有这么多的向上投票,但这将返回groups@SergeyBerezovskiy这应该是好的;鉴于我们不知道他到底想要什么,OP可以简单地操纵它,使之精确到他想要的。他不知道怎么做的部分已经完成了,这足以得到一个好的答案。@Servy有争议。很有争议。然后答案是-use
Enumerable.GroupBy
。OP可以使用适当的列并进行操作results@SergeyBerezovskiy当然你听起来好像觉得那很荒谬。这就是OP真正需要听到的所有内容。这不起作用。除非结果是子查询的一部分,否则不能按聚合函数排序或分组。除非sql更改了我没有的规范,否则不太可能。@IrfanTahirKheli我已经尝试过了,效果很好。但是,如果我想在中添加另一个使用该用户ID的表,比如用户表,您会怎么做呢。@HenrikP:。。检查这个。。希望这就是您要查找的内容。@HenrikP:您可以选择任何列,您需要在Group By子句中包含您选择的所有列。