我的环境:VS 2013 Express中的ASP.net和C#。
我经历了许多类似的SO文章试图解决这个问题。我是Linq to SQL查询和c#的业余爱好者。
我正在尝试使用Linq to SQL从列中获取前5个最新的不同值,然后将它们添加到列表中。我的应用程序是使用c#的asp.net和用于数据抽象的.dbml文件。
我尝试了很多不同的方法。我要么得到非独特但排序的列表,要么我得到一个明确的未排序列表。到目前为止我所拥有的是
var Top5MFG = (from mfg in db.orders
where mfg.manufacturer.Length > 0 && mfg.customerid == "blahblahblahblahblah"<br />
select new {
manufacturer = mfg.manufacturer,
date = mfg.date_created
})
.Distinct()
.OrderByDescending(s => s.date);
我认为我的“Distinct”正在查看“ID”列,也许我需要告诉它我希望它看看“制造商”专栏,但我还没有弄清楚如何/如果它是可能这样做。
我可以通过使用storedproc轻松地完成这项工作,但是如果可能的话,我真的想直接使用c#代码。这是我发给SO的第一篇文章,我希望我能把它正确地放在一起。任何帮助非常感谢。
由于
答案 0 :(得分:1)
没有Distinct
比较manufacturer
和date
对。如果您希望按manufacturer
获取不同的记录,那么我建议DistinctBy
方法。它&#39 ; s在MoreLINQ
库中。由于它是第三个库方法,它在linq到sql中不受支持,你仍然可以通过从DB获取记录来使用它,并在内存中完成其余的工作
(from mfg in db.orders
where mfg.manufacturer.Length > 0 && mfg.customerid == "blahblahblahblahblah"
select new {
manufacturer = mfg.manufacturer,
date = mfg.date_created
})
.AsEnumerable()
.DistinctBy(x => x.manufacturer)
.OrderByDescending(s => s.date)
.Take(5);
答案 1 :(得分:1)
您可以通过某个字段区分的一种方法是替换:
...
.Distinct()
...
使用:
...
.GroupBy(x => x.manufacturer )
.Select(g => g.First())
...
答案 2 :(得分:1)
我认为你可以使用GroupBy做你想做的事。
var Top5MFG = db.orders
.Where (x => x.manufacturer.Length > 0 && x.customerid == "blahblahblahblahblah")
.GroupBy(mfg => mfg.manufacturer)
.Select(g => g.First())
.OrderByDescending(d => d.date_created );
.Take(5);