VB.NET LINQ分组问题:如何对返回IEnumerable(Of tblUitleenbon)的函数按UitleenbonNR分组并保持原返回类型
如何在LINQ中按数字字段分组并返回原类型的IEnumerable(Of tblUitleenbon)
我明白你的困惑——LINQ的Group By和SQL里的用法确实有一点差异,直接用Group By会返回分组集合而非原实体类型,这就是你之前尝试失败的原因。下面根据你的需求分两种常见场景给出解决方案:
场景1:保留所有记录,仅将相同UitleenbonNR的记录聚集在一起
如果你的需求是让同一UitleenbonNR的记录连续排列(类似SQL里按该字段排序的效果),但想通过Group By实现,你可以先分组再展开每个组内的元素,这样就能返回原类型的序列:
' 替换原有Order By的代码行 results = From a In results Group By a.UitleenbonNR Into Group From item In Group Select item
如果还需要对每个组内的记录进行排序(比如按名称),可以在组内追加排序逻辑:
results = From a In results Group By a.UitleenbonNR Into Group From item In Group.OrderBy(Function(x) x.UitleenbonNaam) Select item
不过这里要提一句:如果只是为了让同NR的记录聚集,直接用Order By a.UitleenbonNR会更高效简洁,和上面的Group By再展开效果是一致的。
场景2:每个UitleenbonNR仅保留一条记录
如果你的需求是按UitleenbonNR分组后,每个分组只返回一条记录(比如每组的第一条,或最新的一条),可以在分组后选取组内的目标元素:
取每组的第一条记录
results = From a In results Group By a.UitleenbonNR Into Group Select Group.First()
取每组的最新记录(假设有日期字段UitleenDatum)
results = From a In results Group By a.UitleenbonNR Into Group Select Group.OrderByDescending(Function(x) x.UitleenDatum).First()
关键说明
LINQ的Group By默认返回IEnumerable(Of IGrouping(Of TKey, TElement)),其中IGrouping包含分组键和该组的元素集合。要返回原tblUitleenbon类型的序列,必须对分组结果做进一步处理:要么展开所有组的元素(场景1),要么从每个组中选取单个元素(场景2)。
替换后的完整函数示例(以场景2取每组第一条为例):
Public Function GetUitleenbonnen(ByVal bon As String, ByVal ontlener As String, ByVal asset As String) As IEnumerable(Of tblUitleenbon) dc = New BradyL2S(General.dblocation) Dim results = From a In dc.tblUitleenbons If bon <> "" Then results = From a In results Where a.UitleenbonNaam.Contains(bon) End If If ontlener <> "" Then results = From a In results Where a.UitleenbonOntlenerNaam.Contains(ontlener) End If If asset <> "" Then results = From a In results Where a.UitleenbonAssetNaam.Contains(asset) End If ' 替换原Order By为分组取第一条 results = From a In results Group By a.UitleenbonNR Into Group Select Group.First() Return results End Function
内容的提问来源于stack exchange,提问作者GertDeWilde
相关产品推荐
相关产品推荐

