我在这里遇到了一个精神障碍,我希望我找不到明显的东西。
无论如何,假设我有一个看起来像这样的表:
ID LookupValue SortOrder ============================================ 1 A 1000 2 B 2000 3 B 2000 4 C 3000 5 C 4000
我正在尝试使用Linq查找LookupValue
相同的位置,但排序顺序不同(ID
是我的数据库表上的PK,与此无关运动)。
我认为最简单的方法是按LookupValue
和SortOrder
进行分组,然后在结果中找到LookupValue
出现两次以上的地方。
现在,我获取分组表的代码如下所示:
Dim KeySortPairs = From d In MyDataTable _
Group By Key = d(LookupValue).ToString(), SortOrder = d(SortOrder).ToString() _
Into Group _
Select Key, SortOrder
查看调试输出,上面的代码产生了这个结果(这是正确的):
Key SortOrder ================ A 1000 B 2000 C 3000 C 4000
要获得重复的Key
,我正在查看结果如下:
For Each Entry In KeySortPairs.Where(Function(t) t.Key.Count() > 1)
'Multiple Sort Orders!!'
Next
但是,在此代码中,将返回分组结果中的每个条目。我错过了什么,或者不应该只计算Key
不止一次出现的条目?我认为由于我对VB.NET的低级安慰,我犯了一个微不足道的错误,但我无法弄清楚 - 我已经尝试将Count()
移到WHERE
关于Linq表达的条款,但这给了我同样的东西。
答案 0 :(得分:2)
Key是一个字符串。
Key.Count计算字符串中的字符。
更改选择以包含组
Select Key, SortOrder, Group
并更改where子句以计算组
KeySortPairs.Where(Function(t) t.Group.Count() > 1)
或者,对小组进行统计可能有点过分。 “任何”都可以通过简短的枚举来节省时间。
KeySortPairs.Where(Function(t) t.Group.Skip(1).Any())
(语法可能不完美,我不知道vb.linq)。
答案 1 :(得分:0)
我认为你的每个声明都需要一个groupby。
尝试类似
的内容For Each Entry in KeySortPairs.GroupBy(expression).Where(
答案 2 :(得分:0)
这是一个很老的问题。我只是在尝试。最初在C#中编写解决方案并通过一些在线转换器转换为VB.NET。希望不会冒犯任何人。
Dim tests As New List(Of test)() From { _
New test() With { _
Key.LookUp = "A", _
Key.SortOrder1 = 1000 _
}, _
New test() With { _
Key.LookUp = "B", _
Key.SortOrder1 = 2000 _
}, _
New test() With { _
Key.LookUp = "B", _
Key.SortOrder1 = 2000 _
}, _
New test() With { _
Key.LookUp = "C", _
Key.SortOrder1 = 3000 _
}, _
New test() With { _
Key.LookUp = "C", _
Key.SortOrder1 = 4000 _
} _
}
Dim query = From g In From t In testsGroup t By t.LookUpLet firstsortorder = g.First() Where g.Count() > 1 AndAlso g.Any(Function(t1) firstsortorder.SortOrder1 <> t1.SortOrder1)New With { _
g.Key, _
Key .result = g _
}
For Each item As var In query
Console.WriteLine("key " + item.Key)
For Each item1 As var In item.result
Console.WriteLine(vbTab & vbTab & "sort order " + item1.SortOrder1)
Next
Next