簡體   English   中英

使用Linq獲取字段中具有重復值的最后N行

[英]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 = 3C = Mycolumn ,則我們需要獲取具有MyColumn列重復至少3次的行。

對於上面的示例,它應返回第1、5和6行,因為name55555最后一個索引為6name22最后一個索引(也重復了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM