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

C# 使用Linq获取字段中具有重复值的最后N行数,c#,asp.net,linq,C#,Asp.net,Linq,给定一个数据库表、一个列名C、一个大于1的数字N,如何获得一组列C值相等且至少有N行的行?如果存在多个这样的组,我需要获取包含最新条目(Id最大的条目)的组 是否可以使用LINQ to实体来执行此操作 Example: > Id | Mycolumn > - - - - - - - > 1 | name55555 > 2 | name22 > 3 | name22 > 4 | name22 > 5 | name55555 > 6 | name

给定一个数据库表、一个列名
C
、一个大于1的数字
N
,如何获得一组列
C
值相等且至少有
N
行的行?如果存在多个这样的组,我需要获取包含最新条目(Id最大的条目)的组

是否可以使用LINQ to实体来执行此操作

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
,如果行相同(所有列)坦率地说,每一种都只取一个是没有意义的——它们将无法区分;我不知道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
如果行是相同的(所有列),那么坦率地说,获取每个行中的一个以上是没有意义的——它们将无法区分;我不知道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();

亲切的问候

我已经在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();


是否在此上下文中定义“重复行”?因为如果它们是相同的(这表明您没有主键等),那么为什么要获取多个呢它们是相同的,不是所有的都是相同的,只是一个字段,我更新了我的问题。请提供一个实际数据的例子,然后指示您认为哪些行“复制”。“最后N”是什么命令的?你能有多个不同的分组吗?您的代码片段没有提供任何有用的信息。@Groo,您是对的,我编辑了问题。第5行也与第2行重复。那么,为什么您希望查询返回
{4 6 7}
?它是否应该返回
{5 6 7}
?问题一点也不清楚!:(在这个上下文中定义“重复行”),因为如果它们是相同的(这意味着你没有主键等),那么为什么要获取不止一个?-它们是相同的,不是所有的都是相同的,只是一个字段,我更新了我的问题。请提供一个实际数据的例子,然后指示你认为哪些行是“复制的”。“Last N”按什么排序?可以有多个不同组的这一行吗?您的代码段没有提供任何有用的信息。@Groo,您是对的,我编辑了问题。第5行也与第2行重复。那么,为什么您希望查询返回
{4 6 7}
?它不应该返回
{5 6 7}
?问题根本不清楚!:(我指的是字段中的重复值不是全部columns@farhang67上面的第二个示例显示了一个字段…
name
;只需确保您只按单个字段进行
分区…@ANeves实际上它们都应该工作,但是:我会花很多钱在上面生成一个比LINQ能想到的更明智的执行计划h;pI表示字段中的重复值,而不是全部columns@farhang67上面的第二个示例显示了一个字段…
name
;只需确保您只按单个字段进行
分区…@ANeves实际上它们都应该工作,但是:我会花很多钱在上面生成一个比LINQ更明智的执行计划with;pI看不出linq的SQL提供程序如何支持
Reverse
,因为表是无序的。@Groo因为
orderby
后面有一个
GroupBy
,提供程序只会在生成的SQL中删除order by语句。(因为SQL中的子查询不支持order by)我看不出linq的SQL提供程序如何支持
Reverse
,因为表是无序的。@Groo因为在
orderby
之后有一个
GroupBy
,提供程序只会在生成的SQL中删除orderby语句。(因为SQL中的子查询不支持orderby)OP不需要忽略第一个值,您只需返回包含最大
Id
的组。然后他在第一个示例中出错。我将编辑我的答案。谢谢,谢谢。但这里的一个问题是,如果我们不知道使用skip 1I完全复制了多少次,我想我有一个问题m在我的代码中。我仍然需要检查最高Id,这将确定最后一个副本。OP不需要忽略第一个值,您只需返回包含最大
Id
的组。然后他在第一个示例中出错。我将编辑我的答案。谢谢,非常感谢。但有一个问题下面是如果我们不知道使用skip 1I完全复制了多少次,我想我的代码有问题。我仍然需要检查最高Id,这将确定最后一个副本。