在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
好吧,我是个白痴。我忘了包括:
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中完成这项工作。
我想你需要像'Function(str)str.Name'' –
谢谢Alvin。 dgvComponents是绑定到可观察集合的datagridview。当您单击列标题时,此语句:
返回对象绑定的属性名称。这与添加一个 类似,其中Name是您单击的列标题。在调试中,我可以看到这部分语句正在返回所需的字符串。 –