加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 分组子句与Distinct()

发布时间:2020-12-16 02:02:31 所属栏目:百科 来源:网络整理
导读:我的ASP.NET自定义列表控件从数据库视图中获取其值.检索数据的方法最终返回List Triplet类型的对象.作为控件的DataSource. 我想出了该方法的三种可能的实现方式,它们似乎都能正常工作并给出相同的结果.现在我不确定哪一个应该是首选. 关键是,我需要按字母顺
我的ASP.NET自定义列表控件从数据库视图中获取其值.检索数据的方法最终返回List< Triplet>类型的对象.作为控件的DataSource.

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

关键是,我需要按字母顺序查询查询中的唯一字符串,并且db中有许多重复项.所以我可以获取它们然后执行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();
}

我还想出了以下内容,它为Triplets使用了一个特殊的EqualityComparer.实际上这是我的第一个方法,但我并不喜欢它:

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),这可能是一个优点或缺点.我真的不知道.也许Distict() – solutution会不得不将过多的不必要的数据从db推送到我的方法?

有任何想法应该实施吗?看来我因森林太多而无法看到森林……

解决方法

在需要关注性能(即 do not micro-optimize)之前,您应该选择最易读的解决方案,明确地称为Distinct,因为它可以非常清楚地传达您的意图.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读