我在我的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
我想你需要像'Function(str)str.Name'' –
謝謝Alvin。 dgvComponents是綁定到可觀察集合的datagridview。當您單擊列標題時,此語句:
返回對象綁定的屬性名稱。這與添加一個 類似,其中Name是您單擊的列標題。在調試中,我可以看到這部分語句正在返回所需的字符串。 –