所以我有一段时间试图弄清楚如何完成这个查询语句我在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。我想要展示的是:
我的问题是我无法弄清楚如何为我的查询正确编写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
。这种变化发生在我没有进行任何代码更改的情况下,之前一切正常。那刚刚发生了什么?
答案 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
语句时,程序基本上会重写查询并将其置于之前选择。
对于未来可能遇到类似问题的人,请记住一些事情!