在VB.net中LINQ to SQL Pivot表

时间:2013-09-13 05:42:16

标签: sql vb.net linq pivot crosstab

我正在尝试找到一个结构良好的示例,以便在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和函数选项的任何示例都很有用

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

1 个答案:

答案 0 :(得分: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)})

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

修改

我使用了一个简单的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