1

我在http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-实现 Scott G 的 Dynamic.vb 扩展时遇到问题query-library.aspx在我的 vb 解决方案中。我知道可能还有其他方法,但是这种方法会给我很大的灵活性。我搜索了 StackOverflow(80 多个问答)和许多其他网站,但运气不佳。我正在使用 VS 2010。

我已将 Dynamic.vb 包含在没有根名称空间的问题中,然后在我的主要项目中添加了对该项目的引用。我得到了 4 个重载(而不是 2 个)的智能感知,所以我很确定扩展在范围内。

我在使用条款时遇到了困难,尤其是 Scott 演示的 OrderBy。如果我只是将字符串作为 Scott 的 VB 示例传递,我会收到错误“重载解析失败,因为无法使用这些参数调用可访问的 'OrderBy'。”

代码行是:

Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                    .OrderBy("Name")

因此,我找到了其他说明传递 Lambda 表达式的参考资料。所以我尝试了这个,至少我没有收到错误,即使排序功能似乎仍然不起作用。这是编译和执行的代码。


    Private Sub SortByColumn()

        If Not cmbComponentFilter.SelectedItem.ToString = "All" Then
            Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                               Where Component.ComponentType.ToString = cmbComponentFilter.SelectedItem.ToString _
                               Order By Component.Name

            Dim OrderedFilteredComponentList = From Component As MX.Component In FilteredComponentList.AsQueryable _
                                               .OrderBy(Function(str) dgvComponents.Columns(e.ColumnIndex).Name)

            bsComponentList.DataSource = OrderedFilteredComponentList
            dgvComponents.DataSource = bsComponentList
        Else
            Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                        .OrderBy(Function(str) dgvComponents.Columns(e.ColumnIndex).Name)

            bsComponentList.DataSource = FilteredComponentList
            dgvComponents.DataSource = bsComponentList

        End If

    End Sub

当我询问 dgvComponents.Columns(e.ColumnIndex).Name 时,它​​给出了我希望排序的对象属性,但排序仍然不起作用。我担心为什么我不能让 Scott 的实现工作,但我听过他的主题演讲并阅读了他的博客,所以我猜问题出在我的实现上。

我想要么工作,但也需要了解原因。为什么传递字符串不起作用?函数中声明的PARAMARRAY不是可选的吗?我已经在这方面投入了 8 个小时,虽然我可以走其他路,但我太致力于寻找这种方法的答案而放弃(与方法的自杀协议。)

任何指导将不胜感激。我非常沮丧,如果这是一个愚蠢的错误(通常是这样),我什至不会打扰我。

感谢您的任何帮助。

r/杰米

4

1 回答 1

0

好吧,我是个白痴。我忘了包括:

Imports System.Linq.Dynamic

在使用扩展的类中。现在我已经做到了,这在没有 lambda express 的情况下工作。有效的新代码如下,不需要 Lambda:

    Private Sub SortByColumn()

    If cmbComponentFilter.SelectedItem.ToString <> "All" Then
        Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                           Where Component.ComponentType.ToString = cmbComponentFilter.SelectedItem.ToString

        Dim OrderedFilteredComponentList = From Component As MX.Component In FilteredComponentList.AsQueryable _
                                           .OrderBy(dgvComponents.Columns(e.ColumnIndex).Name)

        bsComponentList.DataSource = OrderedFilteredComponentList
        dgvComponents.DataSource = bsComponentList
    Else
        Dim FilteredComponentList = From Component As MX.Component In ComponentList.AsQueryable _
                                    .OrderBy(dgvComponents.Columns(e.ColumnIndex).Name)

        bsComponentList.DataSource = FilteredComponentList
        dgvComponents.DataSource = bsComponentList

    End If

End Sub

现在我的扩展工作了,我认为这种方法将增加很多价值并减少编码工作,以便根据用户选择动态选择、排序、过滤等数据。我希望我的麻烦可以帮助我水平的其他人更好地了解如何在 vb.net 中进行这项工作。

于 2012-06-20T16:04:57.263 回答