给定一个数据库表,一个列名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 = 3
和C = Mycolumn
,那么我们需要获得列MyColumn
重复至少3次的行。
对于上面的例子,它应该返回第1,5和6行,因为name55555
的最后一个索引是6
,最后一个索引是name22
(它也重复了3次) )是4
。
答案 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);
亲切的问候