1

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

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

我还尝试使用 Linqer 将 SQL Pivot 表转换为 LINQ for 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 与 function 选项一起使用的示例都会很有用

这个用 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)
        };
4

1 回答 1

1

你可以尝试这样的事情。(未测试)刚刚使用您的 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)})

编辑 我在代码中添加了二月。希望能帮助到你。您可以继续在匿名类型中添加此类属性。

编辑

我使用了一个简单的 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
于 2013-09-13T06:52:27.963 回答