我正在尝试设置我的程序,以便我可以对我的数据库执行LINQ查询,并让它只抓取用户希望显示的列。是否显示列由与该列关联的True / False值确定,该值存储在用于存储用户数据的.ini
文件内。
我目前在设置LINQ查询时遇到了麻烦。
Dim query = (From p in dbContext.Parts)
If GetINI("DB_Parts_Columns", "Part_Number", "True") Then
query.Select(Function(x) x.Part_Number)
End If
If GetINI("DB_Parts_Columns", "Manufacturer", "True") Then
query.Select(Function(x) x.Part_Manufacturer.Manufacturer_Name)
query.Take(100)
dataGrid.DataSource = query
编辑:关于GetINI
方法的快速说明。前两个参数是程序假定在文件中查找值的位置(True/False
),如果{{.ini
值中没有匹配的数据,则第三个参数是要设置的默认值1}}文件。
我的代码如上所示,每列有更多If/End If
个语句。我认为这会建立类似
Dim query = (From p In dbContext.Parts
Select p.Part_Number)
然而,当我设置一个简单的MessageBox.Show
来查看查询的外观时,我们只是说,虽然我没有收到任何错误,但查询却什么也没做。我最终获得的结果查询只是一个基本上SELECT * FROM Parts
的查询,但它实际上并没有为我的DataGridView
提供任何数据。
有没有办法设置一个LINQ查询,你可以在一些If/End If
语句之后确定你将要选择的是什么?
编辑:将If/End If
语句中的行更改为:
query = query.Select(Function(x) x.Part_Number)
给我以下错误:
InvalidCastException was unhandled
Unable to cast object of type 'System.Data.Linq.DataQuery`1[System.String]' to type 'System.Linq.IQueryable`1[Database_App.Part]'
答案 0 :(得分:0)
事实证明我以错误的方式解决了我的问题。我试图模仿我试图显示的数据,而不是试图模块化我试图访问的数据。
以下代码完成了我试图完成的任务。
Public Sub GetTable(ByRef dataGrid As DataGridView, tblName As String)
Using dbContext As New Data_LINQDataContext
Select Case tblName
Case "Parts"
Dim query = (From p In dbContext.Parts
Select p.Part_Number, p.Part_Description, p.Part_Information, _
p.Supplier.Supplier_Name, p.Part_Manufacturer.Manufacturer_Name, _
p.Part_Subcategory.Part_Category.Category_Description, _
p.Part_Subcategory.Subcategory_Description).Take(250)
dataGrid.DataSource = query
For Each col As DataGridColumn In dataGrid.Columns
col.Visible = GetINI("DB_Parts_Columns", col.Name, "True")
col.Width = GetINI("DB_Parts_Columns_Width", col.Name, "150")
Next
End Select
End Using
End Sub
感谢任何评论OP的人提供了有用的建议,这是让我得出结论认为这是我正在寻找的实现的原因。