【发布时间】: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 上有很多这样的问题,而不会被认为是题外话。 ^^