2016-06-18 2 views
0

У меня есть таблица вроде этого:Cross таблицы VB.NET и SQL Server & Linq

MAName feldtext 
    ------------------ 
    karl fieldtext1 
    karl fieldtext2 
    karl fieldtext1 
    karl fieldtext3 
    karl fieldtext4 
    karl fieldtext2 
    karl fieldtext5 
    karl fieldtext3 
    karl fieldtext3 
    susi fieldtext1 
    susi fieldtext4 
    john fieldtext2 
    john fieldtext5 
    john fieldtext5 

и мне нужно:

MAName fieldtext1 fieldtext2 fieldtext3 fieldtext4 fieldtext5 FehlerJeMA 
    karl 2   2   3   1   1    9 
    susi 1   0   0   1   0    2 
    john 0   1   0   0   2    3 

Столбцов fieldtext может пойти от fieldtext1 к fieldtextn, это динамическое , в зависимости от запроса.

Я искал здесь решений и нашел, поэтому мой подход:

Dim dt2 As New DataTable 
Dim nn As Integer = 0 
Dim Zeile As DataRow 

dt2.Columns.Add("MAName") 
' fieldtext distinct 
Dim query2 = (From dr In (From d In newTable2.AsEnumerable Select New With {.feldtext1 = d("feldtext")}) Select dr.feldtext1 Distinct) 

For Each Feldtext In query2 
    dt2.Columns.Add(Feldtext)    
Next 

column = New DataColumn() 
column.DataType = System.Type.GetType("System.Int32") 
column.ColumnName = "FehlerJeMA" 
dt2.Columns.Add(column) 

' MAName distinct 
Dim query3 = (From dr In (From d In newTable2.AsEnumerable Select New With {.MAName2 = d("MAName")}) Select dr.MAName2.ToString.ToLower Distinct) 

For Each Mitarbeiter In query3 
    Zeile = dt2.NewRow() 
    Zeile(0) = Mitarbeiter.ToString.ToLower 
    MA2 = Mitarbeiter.ToString.ToLower 

    nn = 1 

    For Each colName2 In query2 

     Fehler2 = colName2 
     Dim AnzahlFehler As String = (From row In newTable2.Rows Select row Where row("MAName").ToString.ToLower = MA2 And row("feldtext") = Fehler2).Count 
     If AnzahlFehler = 0 Then 
      AnzahlFehler = "" 
     End If 
     Zeile(nn) = AnzahlFehler 

     nn += 1 

     If AnzahlFehler <> "" Then 
      FehlerJeMA += CInt(AnzahlFehler) 
     End If 
    Next 

    Zeile(nn) = FehlerJeMA 

    dt2.Rows.Add(Zeile) 
Next 

Это работает, но очень медленно ...

Это может быть так, что в моей таблице имеет более 10.000 рядов ...

Так что мой вопрос: какой быстрый подход получить результат?

Это какой-то кросс-стол с linq? Другие подходы?

+0

Какой версию SQL Server вы используете? – Alex

+0

MSSQL Server 2014 – frank123

+1

Если у вас большое количество строк в таблице, я бы рекомендовал использовать решение SQL Server. Вы можете использовать Google для «Динамического Pivot SQL Server». У SO уже есть несколько ответов: http://stackoverflow.com/questions/25443598/sql-server-dynamic-pivot и http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – Alex

ответ

0

В C# вы будете иметь возможность использовать код, попробуйте перевести его для вашей проблемы:

var pivotData = data.GroupBy(x => new {x.MAName, x.feldtext}, (key, group) => new { MAName = key.Column1, feldtext = key.Column2, count = group.Count() }); 
+0

I «Я не знаком с C#, поэтому я использовал конвертер с http://codeconverter.sharpdevelop.net и конвертер от http://converter.telerik.com/, оба говорят мне: Dim pivotData = data.GroupBy (Function (x) New From {_ \t x.MAName, _ \t x.feldtext _ }, функция (ключ, группа) Новые С {_ \t Key .MAName = key.Column1, _ \t Key .feldtext = key.Column2, _ \t Ключ .count = group.Count() _ }), но я вставляю код в VB, я получил ошибку при первом открытии скобки af ter NEW FROM. можешь мне сказать почему? – frank123

+0

@ frank123 Я не могу, но алгоритм похож на: Группа от MAName, а затем feldtext, получает ключи и подсчитывает элементы в группе. это все :) – W92

Смежные вопросы