2012-06-20 46 views
1

我在我的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是您單擊的列標題。在調試中,我可以看到這部分語句正在返回所需的字符串。 –

回答

0

好吧,我是個白癡。我忘了包括:

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中完成這項工作。