LINQ to SQL Pivot table in VB.net



我正在尝试找到一个结构良好的示例,以便在 VB.net 中使用linq to SQL创建数据透视表。 有很多如何在 C# 中执行此操作的示例,但只有 2 个 VB.net 没有解决我的问题。

我尝试使用 c# 到 VB 转换器将代码更改为 VB.net 但这些似乎不适用于 LINQ。

我还尝试使用 Linqer 将 SQL 数据透视表转换为 LINQ 以进行 VB.net,Linquer 不支持 MS SQL 命令 Pivot。

数据的一个示例是,

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 与函数选项一起使用的示例都将很有用

这个用 C# 编写的示例似乎解决了我的请求,不幸的是我无法将其转换为 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)
        };

你可以尝试这样的事情。(未测试)刚刚使用您的 c# 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控制台应用程序以及您在帖子中提供的数据,它绝对可以正常工作。你可以试试这个。

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

最新更新