[英]Using Linq to get the last N number of rows that have duplicated values in a field
给定一个数据库表,一个列名C
,一个N
大于1的数字,我如何才能得到一组具有相等列C
值的行,而该列至少包含N
行? 如果存在多个这样的组,则需要获取包含最新条目的组(具有最大ID的组)。
是否可以使用LINQ to Entities来做到这一点?
Example:
> Id | Mycolumn
> - - - - - - -
> 1 | name55555
> 2 | name22
> 3 | name22
> 4 | name22
> 5 | name55555
> 6 | name55555
> 7 | name1
Primary Key: ID
OrderBy: ID
Repeated column: Mycolumn
如果N = 3
且C = Mycolumn
,则我们需要获取具有MyColumn
列重复至少3次的行。
对于上面的示例,它应返回第1、5和6行,因为name55555
最后一个索引为6
, name22
最后一个索引(也重复了3次)为4
。
data.Mytable
.OrderByDescending(m => m.Id)
.GroupBy(m => m.Mycolumn)
.FirstOrDefault(group => group.Count() >= N)
.Take(N)
.Select(m => m.Id)
如果行是相同的 (所有列),那么坦率地说,没有意义要取多于一个-它们将是无法区分的。 我不了解LINQ,但是您可以执行以下操作:
select id, name /* more cols */, count(1) from @foo
group by id, name /* more cols */ having count(1) > 1
您可能可以使用GroupBy
等在链接中执行此操作。如果它们不完全相同(例如, IDENTITY
不同,但其他列相同),则会变得更加困难,并且肯定没有简单的LINQ语法可用于它; 但是,在TSQL级别:
select id, name /* more cols */
from (
select id, name /* more cols */,
ROW_NUMBER() over (partition by name /* more cols */ order by id) as [_row]
from @foo) x where x._row > 1
我在Linqpad中将其抓了起来,应该可以得到想要的结果:
int Border = 3;
var table = new List<table>
{
new table {Id = 1, Value = "Name1"},
new table {Id = 2, Value = "Name2"},
new table {Id = 3, Value = "Name5"},
new table {Id = 4, Value = "Name5"},
new table {Id = 5, Value = "Name2"},
new table {Id = 6, Value = "Name5"},
new table {Id = 7, Value = "Name5"},
};
var results = from p in table
group p.Id by p.Value into g
where g.Count() > Border
select new {rows = g.ToList()};
//only in LP
results.Dump();
这将产生第3、4、6、7行。
但是:您只想要最后一次出现,而不是全部,所以您必须再次查询结果:
results.Skip(Math.Max(0, results.Count() - 1)).Take(1);
亲切的问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.