如何在 VB.NET 中使用 linq 与联合多表 orderby 项目而不用 dapper 进行重复

问题描述 投票:0回答:1

我正在尝试将 linq 与联合多表 orderby 项目一起使用,而无需在 VB.NET 中使用 dapper 进行重复。

但是结果不是重复的,是我的代码有问题吗?请指导我。

谢谢

Public Class Form1
    Private Purchase, RetSales, RetPurchase, Sales As New List(Of Invoice)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LoadData()
    End Sub

    Private Laststock23, PurchaseDetails, RetSalesDetails, RetPurchaseDetails, SalesDetails As New List(Of Detail)
    Private Function CreateConnection() As String
        Return ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TRIAL.accdb;Persist Security Info=False;")
    End Function
    Private Sub LoadData()
        Using Connection = New OleDbConnection(CreateConnection())
            Laststock23 = CType(Connection.Query(Of Detail)("SELECT * FROM Laststock23"), List(Of Detail))
            Purchase = CType(Connection.Query(Of Invoice)("SELECT * FROM PURCHASE"), List(Of Invoice))
            PurchaseDetails = CType(Connection.Query(Of Detail)("SELECT * FROM PURCHASEDETAILS"), List(Of Detail))
            RetPurchase = CType(Connection.Query(Of Invoice)("SELECT * FROM RETPURCHASE"), List(Of Invoice))
            RetPurchaseDetails = CType(Connection.Query(Of Detail)("SELECT * FROM RETPURCHASEDETAILS"), List(Of Detail))
            Sales = CType(Connection.Query(Of Invoice)("SELECT * FROM SALES"), List(Of Invoice))
            SalesDetails = CType(Connection.Query(Of Detail)("SELECT * FROM SALESDETAILS"), List(Of Detail))
            RetSales = CType(Connection.Query(Of Invoice)("SELECT * FROM RETSALES"), List(Of Invoice))
            RetSalesDetails = CType(Connection.Query(Of Detail)("SELECT * FROM RETSALESDETAILS"), List(Of Detail))
        End Using
        Dim ls = From lsd In Laststock23
                 Select
         lsd.ITEM,
         LSQ = lsd.QTY,
         PIQ = 0,
         SIQ = 0,
         RPQ = 0,
         RSQ = 0,
        BLC = lsd.QTY
                 Order By ITEM


        Dim ps = From p In Purchase
                 From pd In PurchaseDetails
                 Select
         pd.ITEM,
         LSQ = 0,
         PIQ = pd.QTY,
         SIQ = 0,
         RPQ = 0,
         RSQ = 0,
        BLC = pd.QTY
                 Order By ITEM

        Dim ss = From s In Sales
                 From sd In SalesDetails
                 Select
         sd.ITEM,
          LSQ = 0,
          PIQ = 0,
          SIQ = sd.QTY,
          RPQ = 0,
          RSQ = 0,
             BLC = -sd.QTY
                 Order By ITEM
                 Order By ITEM
        Dim rss = From rs In RetSales
                  From rsd In RetSalesDetails
                  Select
         rsd.ITEM,
          LSQ = 0,
          PIQ = 0,
         SIQ = 0,
         RPQ = 0,
         RSQ = rsd.QTY,
             BLC = rsd.QTY
                  Order By ITEM
        Dim rps = From rp In RetPurchase
                  From rpd In RetPurchaseDetails
                  Select
         rpd.ITEM,
         LSQ = 0,
         PIQ = 0,
         SIQ = 0,
         RPQ = rpd.QTY,
         RSQ = 0,
          BLC = -rpd.QTY


        Dim Card_temp = ls.Union(ps).Union(ss).Union(rps).Union(rss).OrderBy(Function(w) w.ITEM)
        Dim Card As New List(Of ItemCards)
        Dim RunningBalance As Integer = 0
        For Each ct In Card_temp
            Dim sc As New itemCards
            With sc
                .ITEM = ct.ITEM
                .LSQ = ct.LSQ
                .PIQ = ct.PIQ
                .SIQ = ct.SIQ
                .RPQ = ct.RPQ
                .RSQ = ct.RSQ
                .BLC = RunningBalance + ct.BLC
                RunningBalance = .BLC
            End With
            Card.Add(sc)
        Next

        DataGridView1.DataSource = Card
    End Sub

End Class
Public Class Invoice
    Property INVONO() As String
    Property DATEINVO() As Date
    Property CUSTCODE() As String
End Class

Public Class Detail
    Public Property INVONO() As String
    Public Property NOD() As Integer
    Public Property ITEM() As String
    Public Property QTY() As Integer

End Class
Public Class ItemCards
    Public Property ITEM() As String
    Public Property LSQ As Integer
    Public Property PIQ As Integer
    Public Property SIQ As Integer
    Public Property RSQ As Integer
    Public Property RPQ As Integer
    Public Property BLC As Integer
End Class

datagridview 中代码的结果

样本数据

桌子

LASTSTOCK23

项目 数量
测试1000 5
测试2000 10

桌子

PURCHASE

伊沃诺 日期输入 海关代码
PI1000 23 年 1 月 25 日 001

桌子

PURCHASEDETAILS

伊沃诺 诺德 项目 数量
PI1000 1 测试1000 10
PI1000 1 测试2000 20

桌子

SALES

伊沃诺 日期输入 海关代码
SI1000 23 年 1 月 25 日 001

桌子

SALESDETAILS

伊沃诺 诺德 项目 数量
SI1000 1 测试1000 10
SI1000 1 测试2000 20

桌子

RETSALES

伊沃诺 日期输入 海关代码
RS1000 23 年 1 月 25 日 001

桌子

RETSALESDETAILS

伊沃诺 诺德 项目 数量
RS1000 1 测试1000 10
RS1000 1 测试2000 20

桌子

RETPURCHASE

伊沃诺 日期输入 海关代码
RP1000 23 年 1 月 25 日 001

桌子

RETPURCHASEDETAILS

伊沃诺 诺德 项目 数量
RP1000 1 测试1000 10
RP1000 1 测试2000 20

想要的结果

项目 LSQ PIQ SIQ RSQ RPQ BLC
测试1000 5 10 10 10 10 5
测试2000 10 20 20 20 20 10
sql vb.net linq linq-to-sql
1个回答
0
投票

您可以使用这样的简单查询:

SELECT 
       LSD.ITEM, 
       SUM(LSD.QTY) AS LSQ, 
       SUM(PD.QTY)  AS PIQ, 
       SUM(SD.QTY)  AS SIQ, 
       SUM(RSD.QTY) AS RSQ, 
       SUM(RPD.QTY) AS RPQ,
       (LSQ+PIQ+RSQ-SIQ-RPQ) AS BLC
FROM (((LastStock23 AS LSD 
INNER JOIN PurchaseDetails    AS  PD ON LSD.ITEM =  PD.ITEM) 
INNER JOIN SalesDetails       AS  SD ON LSD.ITEM =  SD.ITEM) 
INNER JOIN RetSalesDetails    AS RSD ON LSD.ITEM = RSD.ITEM) 
INNER JOIN RetPurchaseDetails AS RPD ON LSD.ITEM = RPD.ITEM
GROUP BY LSD.ITEM

最好将所有交易保存在一个表中,并添加交易类型字段(购买、明细、退货购买、退货明细)

© www.soinside.com 2019 - 2024. All rights reserved.