Sql 在VB.NET中使用LINQ Lambda的位置后选择

Sql 在VB.NET中使用LINQ Lambda的位置后选择,sql,vb.net,linq,select,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

因此,我花了很长时间试图找出如何完成这个查询语句,我正在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窗体,它有一堆不同的输入元素(文本框和组合框),用户可以使用这些元素搜索零件数据库。上面的方法是我的方法,它在用户按下搜索按钮后运行查询

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

无论如何,现在代码运行良好,但我返回的是Parts表的每一列。我想展示的是:

  • 零件号和零件说明[零件表]
  • 供应商名称[供应商表]
  • 子类别\说明[零件\类别\子表]
我的问题是我不知道如何为我的查询正确编程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语句呢?我在网上找到的关于如何使这项工作发挥作用的任何信息,我似乎都弄不清楚

编辑:添加到这里,而不是提出新问题,但我有一个新的错误,这是wierd我了。如前所述,在我能够使用提交的数据运行此方法并让它只显示
部分
表的所有行之前


但是,突然,再次运行程序时,我看到的列在我的3个查询变量
p、s、sc
上标题为:
AppName.ColumnName
。例如,
p
列的读数为
AppName.Part
。这一变化发生在我没有做任何代码更改的情况下,当时一切正常。那到底发生了什么事?

好吧,在寻找了几个小时的解决方案之后……我觉得有点傻。
我的解决方案是从根本上改变这一点:

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
语句

我认为这个错误是因为在我的头脑中,我知道如果我真的输入了一个查询,我需要在
Select
语句之前放置任何
Where
子句。但是,由于查询直到代码的
query.ToList()
部分才执行,因此每次我在
Select Case
块中添加
Where
语句时,程序基本上会重写查询并将其放在Select之前


对于将来可能有类似问题的人,请记住一些事情

此外,您还应该记住,当您在适当地设计数据库时,所有关系都已就绪,您“很少”需要在Linq中使用“join”关键字。相反,您只需使用“点表示法”-即:p.Supplier.Supplier\u Name.@CetinBasoz我不知道这一点。你刚才炸了我的脑袋。