使用Linq获取字段中具有重复值的最后N个行

时间:2013-11-21 10:31:00

标签: c# asp.net linq

给定一个数据库表,一个列名C和一个大于1的数字N,如何获得一组具有相同值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 = 3C = Mycolumn,那么我们需要获得列MyColumn重复至少3次的行。

对于上面的例子,它应该返回第1,5和6行,因为name55555的最后一个索引是6,最后一个索引是name22(它也重复了3次) )是4

3 个答案:

答案 0 :(得分:2)

data.Mytable
    .OrderByDescending(m => m.Id)
    .GroupBy(m => m.Mycolumn)
    .FirstOrDefault(group => group.Count() >= N)
    .Take(N)
    .Select(m => m.Id)

答案 1 :(得分:1)

如果行相同(所有列),那么坦率地说,没有任何一点可以获取多个 - 它们将无法区分;我不知道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

答案 2 :(得分: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);

亲切的问候