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

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

问题描述:

我在我的vb解决方案中执行Scott G的Dynamic.vb扩展在http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx时遇到问题。我知道可能还有其他方法,但这种方法会给我很大的灵活性。我搜索了StackOverflow(80+ Q & As)和其他很多没有太多运气的网站。我正在使用VS 2010.在VB.Net中的动态Linq .OrderBy不接受字符串

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

我在条款上经历了一段艰难的时期,特别是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它给人的对象属性我想排序,但排序仍然是行不通的。我担心为什么我不能让斯科特的实施工作,但我已经听到他的主题演讲并阅读他的博客,所以我猜测问题在于我的实施。

我想要工作但需要理解为什么。为什么不传递一个字符串的工作? PARAMARRAY不是在函数中声明的可选项?我已经投入了8个小时的时间,虽然我可以走上其他的道路,但我仍然致力于找到放弃这种方法的答案(自杀协议的方法)。不胜感激。我很伤心,如果这是一个愚蠢的错误(它通常是这样),我甚至不会打扰我。

感谢您的任何帮助。

r/Jamie

+0

我想你需要像'Function(str)str.Name'' –

+0

谢谢Alvin。 dgvComponents是绑定到可观察集合的datagridview。当您单击列标题时,此语句:

dgvComponents.Columns(e.ColumnIndex).Name)
返回对象绑定的属性名称。这与添加一个
Order By objComponent.Name
类似,其中Name是您单击的列标题。在调试中,我可以看到这部分语句正在返回所需的字符串。 –

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

Imports System.Linq.Dynamic 

在类中使用扩展名。现在,我已经完成了这项工作,但没有使用lambda表达式。该工作新的代码如下,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 

现在,我有扩展的工作,我认为这种做法将增加很多价值,降低编码努力dynically选择,排序,过滤等数据基于用户选择。我希望我的麻烦可能会帮助我的其他人更好地理解如何在vb.net中完成这项工作。