Csharp/C#教程:分组条款与Distinct()分享


分组条款与Distinct()

我的ASP.NET自定义列表控件从数据库View获取其值。 检索数据的方法最终返回List类型的对象作为控件的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推送到我的方法?

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

在需要关注性能(即不进行微优化 )之前,您应该选择最易读的解决方案,明确地称为Distinct因为它可以非常清楚地传达您的意图。

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

由于存在许多重复项,因此在数据库中应用distinct是最好的。

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

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

上述就是C#学习教程:分组条款与Distinct()分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1003275.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐