У меня здесь мысленный барьер, и я надеюсь, что упускаю что-то очевидное.
В любом случае, предположим, что у меня есть таблица, которая выглядит так:
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, но это дал мне то же самое.





Ключ - это строка.
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).
Кроме того, подсчет группы, похоже, не работает. Логически я не уверен, что это имеет смысл, поскольку по определению group by будет возвращать только одну уникальную пару Key, SortOrder - правильно?
Группы в linq иерархические, в отличие от SQL. У группы есть ключ и один или несколько дочерних элементов. Доступ к этим элементам можно получить, перечислив группу. msdn.microsoft.com/en-us/library/bb344977.aspx
Я думаю, вам нужна группа для каждого утверждения.
Попробуйте что-нибудь вроде
For Each Entry in KeySortPairs.GroupBy(expression).Where(
Это действительно старый вопрос. Я просто пробовал. Изначально написал решение на 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
Ах да! Это объясняет, почему t.Key.Count ()> 7 (тест, который я пробовал) не возвращал результатов!