【问题标题】:LINQ to SQL Pivot table in VB.netVB.net 中的 LINQ to SQL 数据透视表
【发布时间】:2013-09-13 05:42:16
【问题描述】:

我正在尝试找到一个结构良好的示例,以在 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)
        };

【问题讨论】:

    标签: sql vb.net linq pivot crosstab


    【解决方案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
    

    【讨论】:

    • Nilesh - 感谢您的反馈。您可以在示例中添加一个附加字段吗? IE。二月?我几乎设法让一个示例(类似于您的帖子)起作用,但无法添加列或呈现以正确记录。
    • 我想将查询转换为更类似于查询的形式。例如 - link。最大的挑战是用 VB 语法来表示。
    • 我试过这个没有结果 Dim inspects = From f In db.Tbl_Inspections Where f.Project_Sub_Comp_ID = ProjectSubCompID Select f Dim test = inspects.GroupBy(Function(xCustomer) xCustomer.Control_Status_ID).Select(Function (xCustomers) 新的 {xCustomers.Key, .Jan = xCustomers.Where(Function(y) y.Component_ID = 1).FirstOrDefault(Function(s) s), .Feb = xCustomers.Where(Function(y) y. Component_ID = 2).FirstOrDefault(Function(s)})
    • 你知道如何对 linq 查询做同样的事情吗?即dim test = from s in db.table(selec........
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多