使用LINQ Lambda在WHERE之后的SELECT在VB.NET中

时间:2018-05-29 14:23:31

标签: sql vb.net linq select

所以我有一段时间试图弄清楚如何完成这个查询语句我在VB.Net上的LINQ工作。

这是我目前的代码:

Sub Part_Search(iData As List(Of String), ByRef dataGrid As DataGridView)
    Dim query = From p In db.Parts
                Join s In db.Suppliers On s.Supplier_ID Equals p.Supplier_ID
                Join sc In db.Parts_Category_Subs On sc.Subcategory_ID Equals p.Subcategory_ID
    For i = 0 To iData.Count - 1
        If Not iData(i).ToString() = "" Then
            Select Case i
                Case 0
                    Dim partNum As String = iData(i).ToString()
                    query = query.Where(Function(x) x.p.Part_Number = partNum)
                Case 1
                    Dim description As String = iData(i).ToString()
                    query = query.Where(Function(x) x.p.Part_Description = description)
                Case 4
                    Dim supp As String = iData(i).ToString()
                    query = query.Where(Function(x) x.s.Supplier_Name = supp)
            End Select
        End If
    Next
    'SELECT STATEMENT HERE
    dataGrid.DataSource = query.ToList()
End Sub

所以,现在解释一下我刚刚发布的内容。

我有一个Windows窗体,它有许多不同的输入元素(TextBoxes和ComboBoxes),用户可以使用它们来搜索零件数据库。上面的方法是我的方法,一旦用户按下搜索按钮就运行查询。

传递的iData字符串列表是一个List,它包含按下按钮时输入字段中的任何值。该列表甚至包含空值,因此列表的每个特定索引将始终与特定的表列相关联。例如,列表中的第一个值始终Part_Number字段。这就是我选择在迭代循环中使用Select语句的原因。这似乎是轻松浏览每个输入值的最简单方法。

无论如何,现在代码运行正常,但我返回的是我的Parts表的每个Column。我想要展示的是:

  • Part_Number& Part_Description [零件表]
  • Supplier_Name [供应商表]
  • 子类别_描述[Parts_Category_Subs表格]

我的问题是我无法弄清楚如何为我的查询正确编写Lambda Select()语句。我试过了:

query = query.Select(Function(x) New With { x.p.Part_Number, x.p.Part_Description, x.s.Supplier_Name, x.sc.Subcategory_Description })

除了一些其他的东西,但我要么在调试器中或在操作期间出错。

那么我如何编写Select语句?我似乎无法在网上找到有关如何使其发挥作用的任何信息。或者

编辑:将其添加到此处而不是提出新问题,但我遇到了一个让我感到不快的新错误。正如我上面所述,之前我能够使用提交的数据运行此方法,并让它只显示Parts表的所有行。

然而,突然,再次运行程序我看到的列标题为我的3个查询变量p, s, sc,每个数据行的读数为:AppName.ColumnName。例如,p列的读数为AppName.Part。这种变化发生在我没有进行任何代码更改的情况下,之前一切正常。那刚刚发生了什么?

1 个答案:

答案 0 :(得分:0)

好的,所以经过几个小时的寻找解决方案......我觉得有点傻 我的解决方案是基本改变这个:

Dim query = From p In db.Parts
            Join s In db.Suppliers On s.Supplier_ID Equals p.Supplier_ID
            Join sc In db.Parts_Category_Subs On sc.Subcategory_ID Equals p.Subcategory_ID

对此:

Dim query = From p In db.Parts
            Join s In db.Suppliers On s.Supplier_ID Equals p.Supplier_ID
            Join sc In db.Parts_Category_Subs On sc.Subcategory_ID Equals p.Subcategory_ID
            Select p.Part_Number, p.Part_Description, s.Supplier_Name, sc.Subcategory_Description

我的问题是我在查询的初始声明中缺少Select语句。

我认为这个错误是因为在我的脑海中,我知道如果我实际上是在输入查询,我需要在Where语句之前放置任何Select子句。但是因为在代码的query.ToList()部分之前不执行查询,所以每次在Where块中添加Select Case语句时,程序基本上会重写查询并将其置于之前选择。

对于未来可能遇到类似问题的人,请记住一些事情!