我有一个像下图这样的表,有两列“cas”和“pref”,你可以看到“cas”列中有常见的值,所以我想按“cas”分组并只获取那些有的行使用c#中的Linq在“pref”列中的最大字符串长度。
输入表:
必需输出:
我正在使用以下查询来获取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 :(得分:1)
这应该有效:
var results = yourTable.GroupBy(x => x.cas).Select(g => g.OrderByDescending(og => og.pref.Length).First());
答案 1 :(得分:1)
这将返回每组中最长的元素:
] (+ 1 2 (* 4 5))
23
] +
#<procedure:+>
] 1
1
] 2
2
] (#%app * '4 '5)
20
] *
#<procedure:*>
] 4
4
] 5
5
] (+ 1 2 (* 4 5))
23
答案 2 :(得分:1)
我认为数据结构是这样的:
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()
;
答案 3 :(得分: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)) };
答案 4 :(得分:0)
您可以从表格中按照 Pref 属性的长度对所有数据进行排序,将它们按 Cas 值分组,然后只获取每个组中的第一个元素
var result = from p in table
orderby p.Pref.Length descending
group p by p.Cas into g
select g.First();