Получение счета из сгруппированной таблицы данных в VB через Linq - PullRequest
2 голосов
/ 13 октября 2008

Я сталкиваюсь здесь с умственным препятствием и надеюсь, что мне не хватает чего-то очевидного.

В любом случае, предположим, у меня есть таблица, которая выглядит следующим образом:

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 выражение, но это дало мне то же самое.

Ответы [ 3 ]

2 голосов
/ 13 октября 2008

Ключ - строка.

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).

0 голосов
/ 02 июля 2015

Это действительно старый вопрос. Я просто пытался. Первоначально написал решение на 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
0 голосов
/ 13 октября 2008

Я думаю, вам нужен групповой член для каждого утверждения.

Попробуйте что-то вроде

For Each Entry in KeySortPairs.GroupBy(expression).Where(
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...