用于选择

时间:2018-06-11 19:48:49

标签: vb.net linq

我正在尝试设置我的程序,以便我可以对我的数据库执行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]'

1 个答案:

答案 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的人提供了有用的建议,这是让我得出结论认为这是我正在寻找的实现的原因。