【问题标题】:Group by clause vs. Distinct() [closed]Group by 子句与 Distinct() [关闭]
【发布时间】:2014-07-21 16:10:46
【问题描述】:

我的 ASP.NET 自定义列表控件从数据库 View 获取其值。检索数据的方法最终返回一个List<Triplet> 类型的对象作为控件的DataSource。

我为该方法找出了三种可能的实现,它们似乎都可以正常工作并给出相同的结果。现在我不确定应该首选哪一个。

关键是,我需要查询中按字母顺序排列的唯一字符串,并且数据库中有 很多 个重复项。所以我可以全部获取它们,然后执行 Distinct() 以获得唯一值...

public override object GetData()
{
    return 
    (
        from name in
        (
            from job in DBConnection.NewDataContext.vJobs
            where job.name != null 
            select job.name

        ).Distinct().OrderBy(s => s) 

        select new Triplet(name, name, ListType)

    ).ToList();
 }

...或者我可以使用 group by 子句并且只选择键:

public override object GetData()
{
    return 
    (
        from job in DBConnection.NewDataContext.vJobs 
        where job.name != null
        group job by job.name into names 
        orderby names.Key 
        select new Triplet(names.Key, names.Key, ListType)

    ).ToList();
}

我还想出了以下方法,它使用了一个特殊的 EqualityComparer 来表示 Triplets。实际上这是我的第一种方法,但我不是很喜欢它:

public override object GetData()
{
    return
    (
        from job in DBConnection.NewDataContext.vJobs 
        where job.name != null
        select new Triplet(job.name, job.name, ListType)

    ).ToList().Distinct(new TripletComparer()).OrderBy(t => (string)t.First).ToList();
}

我认为逐个解决方案将大部分工作留给数据库(MS SQL Server),这可能是优点或缺点。我真的不知道。也许 Disct() 解决方案不得不将太多不必要的数据从数据库推送到我的方法?

有什么想法应该实施吗?因为树太多了,好像看不到森林……

【问题讨论】:

  • 1.) 这似乎是过早的优化 2.) 这可能应该在codereview.stackexchange.com 3.) 让 SQL Server 完成工作,这就是它的优点。
  • 我认为基本上GroupBy提供了将同一键的多个对象分组到一个对象下的功能,这在按国家分组等场景中很有用。 Distinct 只会找到其中一个键并将其保留。因此,对于国家/地区方案,您只会为每个国家/地区获得一个对象
  • 这个问题似乎是题外话,因为它属于Code Review
  • 抱歉这里跑题了。以前从未听说过 Code Review,帮助中心没有提到它。请怜悯新人。
  • 顺便说一句,这个问题属于“最好的方法......?”,并且在 stackoverflow 上有很多这样的问题,而不会被认为是题外话。 ^^

标签: c# .net linq distinct


【解决方案1】:

在需要关注性能(即do not micro-optimize)之前,您可能应该选择最易读的解决方案,显然是调用Distinct,因为它非常清楚地传达了您的意图。

如果您真的关心性能,那么我建议您使用profiler 执行一些具体的基准测试。

【讨论】:

  • 感谢您的回答和链接。所以我将使用Distinct 解决方案。是的,也许它是微优化......但是我正在处理的网站已经足够慢了,当然它不是应用程序中唯一的此类查询。如果可以避免的话,我只是不想增加另一个瓶颈。
【解决方案2】:

由于有很多重复项,最好在数据库中应用 distinct。

Linq-2-sql 使用延迟加载。但是,调用ToList() 将使您的查询在数据库中执行,因此之后的所有内容都在内存中。

因此第一个可能是最好的。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多