我的ASP.NET自定义列表控件从数据库View
获取其值。检索数据的方法最终返回类型为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() - 解决方案不得不将过多的不必要的数据从db推送到我的方法?
任何应该实施的想法?由于树木太多,我似乎无法看到森林......
答案 0 :(得分:6)
在需要关注性能(即do not micro-optimize)之前,您应该选择最易读的解决方案,明确地称之为Distinct
,因为这样可以非常清楚地传达您的意图。
如果您真的关心性能,那么我建议您使用profiler执行一些具体的基准测试。
答案 1 :(得分:1)
由于存在许多重复项,因此在数据库中应用distinct是最好的。
Linq-2-sql使用延迟加载。但是,调用ToList()
将使您的查询在数据库中执行,因此之后的所有内容都在内存中。
因此,第一个可能是最好的。