动态Linq .OrderBy在VB.Net中不接受字符串

时间:2012-06-20 05:15:59

标签: vb.net

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

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

我在条款方面遇到了困难,尤其是斯科特所展示的OrderBy。如果我只是传递一个字符串作为Scott的VB示例,我得到错误“重载解析失败,因为没有可访问的'OrderBy'可以用这些参数调用。”

代码行是:

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

所以我找到了其他引用传递Lambda表达式的引用。所以我尝试了这个,至少我没有得到任何错误,即使sort函数似乎仍然不起作用。这是编译和执行的代码。


    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 /杰米

1 个答案:

答案 0 :(得分: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中完成这项工作。