2016-09-28 81 views
1

我有这样两个栏“CAS”和“期望”下面的图像的列表,你可以看到有在“CAS”列共同的价值观,所以我想组由“中科院”并获取只有那些具有最大的行使用c#中的Linq在“pref”列中输入字符串长度。如何只使用linq从表中获取最大字符串长度列行?

输入表:

enter image description here

所需的输出:

enter image description here

我使用下面的查询,以获得在SQL上所需的输出,但如何通过LINQ办呢?

select cas, (select top 1 pref from pdf_tab b where b.cas = a.cas order by LEN(pref) desc) 
     from pdf_tab a group by cas 
+0

对不起,我想LINQ。 –

+0

有标志C#和LINQ – ipavlu

回答

1

这将从每个组返回最长的元素Pref物业,由Cas值,然后只获取每个组的第一个元素。

var result = from p in table 
      orderby p.Pref.Length descending 
      group p by p.Cas into g 
      select g.First(); 
+0

非常感谢你:) –

1

这应该工作:

 var results = from p in tablename 
     group p by p.cas into g 
     select g.OrderByDescending(e=>e.pref.Length).First() 
0
var results = from p in tablename 
      group p by p.cas into g 
      order by g.Key 
      select new { cas = g.Key, maximum = 
g.First(r => r.pref.Length == g.Max(y => y.pref.Length)) }; 
+0

它没有返回最大长度值...它返回第一个值只有像“水”中科院“1000”,但我需要“ldkfldkflkdlfkdlfkldk”中科院1000 –

+0

你可以尝试把栽培大豆( X => x.pref.Length) –

+0

赞成票我已经添加了相同 –

0

你可以从该表由长度降序所有的数据:

var results = yourTable.GroupBy(x => x.cas).Select(g => g.OrderByDescending(og => og.pref.Length).First()); 
1

我presumne的数据结构是这样的:

class Data 
{ 
    public int cas {get;set; 
    public string pref {get;set;} 
} 

and some record: 

List<Data> records; 

因为你说C#和LINQ,它必须是这样:)。

从那里,它很简单:

List<Data> newRecords = 
records 
.GrouBy(data => data.cas) 
.Select(gData => gData 
       .OrderBy(x => x?.pref?.Length ?? 0) 
       .LastOrDefault()) 
.Where(data => data != null) 
.ToList() 
; 
相关问题