Сводная таблица LINQ to SQL в VB.net

Я пытаюсь найти хорошо структурированный пример для создания сводной таблицы с использованием linq to SQL в VB.net. есть много примеров того, как это сделать на С#, но только 2 на VB.net, которые не решили мою проблему.

Я пытался использовать конвертеры С# в VB, чтобы изменить код на VB.net, но они не работают с LINQ.

Я также пытался преобразовать сводную таблицу SQL в LINQ для VB.net с помощью Linqer, Linquer не поддерживает команду Pivot MS SQL.

пример данных,

name    prod    status
a1      1       1
a1      2       2
a2      3       1

результат должен быть

name    prod1    prod2    prod3
a1      1        2        0
a2      0        0        1

Первой целью было бы написать запрос linq для возврата сводной таблицы, желаемый результат - выполнить отдельный запрос в столбце "prod" и создать динамическую сводную таблицу.

Просмотрев все примеры C#, я вижу, что если я хочу использовать linq, мне нужно будет перенести код на C#, к сожалению, я знаю только VB.net.

Любые примеры, использующие VB.net с параметром function, будут полезны.

этот пример, написанный на С#, кажется, отвечает моему запросу, к сожалению, я не могу преобразовать его в VB.net.

 var query = from foo in db.Foos
        group foo by foo.Date into g
        select new {
            Date = g.Key,
            A = g.Where(x => x.Employee == "A").Sum(x => x.Job1),
            B = g.Where(x => x.Employee == "B").Sum(x => x.Job1),
            C = g.Where(x => x.Employee == "C").Sum(x => x.Job1),
            D = g.Where(x => x.Employee == "D").Sum(x => x.Job1),
            Total = g.Sum(x => x.Job1)
        };

person user2668812    schedule 13.09.2013    source источник


Ответы (1)


Вы можете попробовать что-то вроде этого. (НЕ ПРОВЕРЕНО) Только что использовал ваш С# LINQ для преобразования в VB

Dim test = customers.GroupBy(Function(xCustomer) xCustomer.CustId) _
               .Select(Function(xCustomers) 
                           New With {xCustomers.Key,
                           .Jan = xCustomers.Where(Function(y) y.OrderDate.Month = 1).Sum(Function(s) s.Qty),
                           .Feb = xCustomers.Where(Function(y) y.OrderDate.Month = 2).Sum(Function(s) s.Qty)})

РЕДАКТИРОВАНИЕ Я добавил Feb в код. Надеюсь, поможет. Вы можете просто добавить такие свойства в анонимный тип.

ИЗМЕНИТЬ

Я использовал простое приложение VB Console с данными, которые вы предоставили в своем посте, и оно работает абсолютно нормально. Вы можете попробовать это.

Sub Main()

    Dim samples As New List(Of Sample)
    samples.Add(New Sample() With {.Name = "a1", .Prod = 1, .Status = 1})
    samples.Add(New Sample() With {.Name = "a1", .Prod = 2, .Status = 2})
    samples.Add(New Sample() With {.Name = "a2", .Prod = 3, .Status = 1})

    Dim test = samples.GroupBy(Function(xSample) xSample.Name) _
               .Select(Function(xGrouping) New With { _
                           xGrouping.Key,
                           .Prod1 = xGrouping.FirstOrDefault(Function(x) x.Prod = 1), _
                           .Prod2 = xGrouping.FirstOrDefault(Function(x) x.Prod = 2), _
                           .Prod3 = xGrouping.FirstOrDefault(Function(x) x.Prod = 3) _
                           })

    Console.Write("Name")
    Console.Write(Microsoft.VisualBasic.vbTab)
    Console.Write("Prod1")
    Console.Write(Microsoft.VisualBasic.vbTab)
    Console.Write("Prod2")
    Console.Write(Microsoft.VisualBasic.vbTab)
    Console.Write("Prod3")
    Console.Write(Microsoft.VisualBasic.vbTab)
    Console.WriteLine()
    For Each test1 In test
        Console.Write(test1.Key)
        Console.Write(Microsoft.VisualBasic.vbTab)
        If (test1.Prod1 IsNot Nothing) Then
            Console.Write(test1.Prod1.Status)
        Else
            Console.Write(0)
        End If
        Console.Write(Microsoft.VisualBasic.vbTab)
        If (test1.Prod2 IsNot Nothing) Then
            Console.Write(test1.Prod2.Status)
        Else
            Console.Write(0)
        End If
        Console.Write(Microsoft.VisualBasic.vbTab)
        If (test1.Prod3 IsNot Nothing) Then
            Console.Write(test1.Prod3.Status)
        Else
            Console.Write(0)
        End If
        Console.WriteLine()
    Next
    Console.ReadLine()
End Sub
person Nilesh    schedule 13.09.2013
comment
Нилеш - Спасибо за отзыв. Не могли бы вы добавить в свой пример дополнительное поле? т.е. февраль? Мне почти удалось заставить один пример (похожий на вашу публикацию) работать, но я не смог добавить столбцы или представить правильную запись. - person user2668812; 13.09.2013
comment
Я хотел бы получить запрос в форме, более похожей на запрос. например - ссылка. самая большая проблема состоит в том, чтобы представить это в синтаксисе VB. - person user2668812; 13.09.2013
comment
Я пробовал это безрезультатно Dim inspects = From f In db.Tbl_Inspections Где f.Project_Sub_Comp_ID = ProjectSubCompID Select f Dim test = inspects.GroupBy(Function(xCustomer) xCustomer.Control_Status_ID).Select(Function(xCustomers) New With {xCustomers. Ключ, .Jan = xCustomers.Where(Function(y) y.Component_ID = 1).FirstOrDefault(Function(s) s), .Feb = xCustomers.Where(Function(y) y.Component_ID = 2).FirstOrDefault(Function (SS)}) - person user2668812; 13.09.2013
comment
Знаете ли вы, как сделать то же самое с запросом linq? т. е. dim test = from s в db.table(select........ - person user2668812; 13.09.2013