[英]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.