我在查找有关使用 lambda 表达式的最新答案时遇到了问题,并订购了一个包含来自实体的表数据的列表,该列表按“喜欢”排序,没有重复的“机构”,并且只显示前 100 个。
我有以下内容,但我猜它对 distinct 不起作用。每次我运行它并检查它时,它仍然会出现重复的机构名称。我不知道为什么它不处理重复的机构名称。
public PartialViewResult Top100()
{
List<New_NYC_Usage_Table> data = db.New_NYC_Usage_Table.ToList();
data = db.New_NYC_Usage_Table.Where(x => x.Platform != "TOTAL").ToList();
data = data.OrderByDescending(x => x.Agency).Distinct().ToList();
data = data.OrderByDescending(x => x.Likes_Follows_Etc).Take(100).ToList();
return PartialView("_Data", data);
}
如果我不清楚或这篇文章不相关或重复主题,请指出正确的方向或 MSDN 链接或带有有用示例的引用,谢谢。
最佳答案
我认为您正在尝试获取按喜欢、关注等排序的前 100 家机构的列表,但如果某个机构两次出现在该列表中,我假设您只想要排名最高的展示,而不是两者。
我认为这个 linq 查询应该做你想做的(尽管我只能在类似的表上测试它所以一定要仔细检查)
var data = db.New_NYC_Usage_Table.Where(x => x.Platform != "TOTAL")
.GroupBy(x => x.Agency, (key, g) => g.OrderByDescending(x => x.Likes_Follows_Etc).First()).OrderByDescending(x => x.Likes_Follows_Etc).Take(100).ToList();
这是正在发生的事情。我正在获取平台不是“TOTAL”的所有记录,然后按机构对它们进行分组。然后在每个组中我得到最高的赞,这样我在每个组中只有一个代理机构。然后我按喜欢对这些记录进行排序,最后进入前 100 名。
我注意到在您的代码中您总是在每次查询后调用 .toList,这通常不是必需的并且通常会损害性能。您应该只在最后可能的时刻调用列表。你的 linq 表达式实际上不是数据的集合,而是你想要的指令,你可以继续添加到这个指令(就像你在你的代码中做的那样,但没有“.toList”)并且它实际上不会去并且获取数据,只有当您真正尝试查看数据时,它才会最终为您获取数据,从而使其非常高效。每次调用 .toList 时,您都在要求对数据进行评估,但此时您不关心那里有什么,您只关心返回结果中的内容。
关于c# - 使用不同名称的 LINQ to Entities 表前 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37087532/