【问题标题】:LINQ to Entities Table top 100 with using distinct nameLINQ to Entities Table top 100 with using distinct name
【发布时间】:2016-09-02 10:07:01
【问题描述】:

我无法找到使用 lambda 表达式的最新答案,并订购了一个包含来自实体的表数据的列表,该列表按“喜欢”排序,没有重复的“机构”,仅显示前 100 名。

我有以下内容,但我猜它并不适用。每次我运行它并检查它,它仍然会出现重复的机构名称。我不知道为什么它不处理重复的机构名称。

        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 链接或提供有用示例的参考,谢谢。

【问题讨论】:

  • Distinct() 只占两个相同的行。当多行具有相同的Agency 时,您期望会发生什么,取第一行?
  • 不要每次都使用.ToList(),你只需要在倒数第二行。每次这样做时,您都在不必要地迭代整个列表。

标签: c# mysql asp.net entity-framework linq


【解决方案1】:

我认为您正在尝试获取按喜欢、关注等排序的前 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 时,您都要求评估您的数据,但此时您并不关心那里有什么,您只关心返回结果中的内容。

【讨论】:

  • 嗨 Mark_H,非常感谢,代码可以工作,但由于实例错误,我没有使用 First(),而是将其更改为 FirstorDefault(),它只能用作最终查询。 ^_^
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多