2009-09-18 22 views
6

我正在使用Microsoft的動態Linq庫/示例對列表進行排序。因此,例如,我有以下的C#代碼:動態LINQ表達式中的空引用異常

myGrid.DataSource=repository.GetWidgetList() 
     .OrderBy(sortField + " " + sortDirection).ToList(); 

我必須在我的畫線處於0的情況下:與另一個對象,這有可能會顯示在網格屬性1的關係。當我們嘗試並對此進行排序時,只要我的所有小工具都有這個孩子,就可以正常工作。例如,我們以Child.Name訂購。但是,當Child爲空時,我們會得到空引用異常。

我在這裏有一些選擇,我知道我可以選擇到一個匿名類型並綁定到,我也可以在父對象上公開Child.Name並通過代碼處理這個(我不喜歡包含我的對象模型)。

在理想的世界中,我想更新庫來處理這種情況。在深入研究之前,我想知道是否有人遇到過這個問題,並且已經有解決方案了?

編輯

貌似我沒有解釋不夠好。我正在使用C# samples附帶的Dynamic Linq Library。這個庫補充說,讓你用一個lambda表達式的字符串就地所以我的代碼實際上是這樣的一些不錯的擴展:

private void BindGrid(sortField,sortDirection) 
{ 

    this.grid.DataSource=....OrderBy("MyField ASC").... 
} 

當然串有被替換的參數。但是這允許我們在用戶點擊網格標題時動態改變排序。我們不必如果其他邏輯來處理所有的排列。

我的解決辦法,因爲我記錄的波紋管改變了我很好的清潔方法爲:

private void BindGrid() 
{ 
    var sortField=this._sortField; 
    if (sortField=="Child.Name") 
    { 
     sortField="iif(Child==null,null,Child.Name)"; 
    } 
    this.grid.DataSource=repository.GetWidgetList() 
            .OrderBy(sortField + " " + this._sortDirection) 
            .ToList(); 
} 

雖然這個工程,這意味着現在我必須爲我們增加我們要公開新的字段或屬性更新此代碼在子對象上的網格中。

回答

5

如果我理解正確的話,我想你想要這樣的:

repository.GetParentObjects() 
    .OrderBy(p => p.Child == null ? "" : p.Child.Name); 

LINQ將能夠生成模仿此表達式的SQL。

+1

不,這不是我所指的。動態linq是C#示例代碼的一部分,可讓您將字符串用作OrderBy。它在運行時將字符串編譯爲lambda表達式。 – JoshBerke

+6

爲什麼這個答案被接受爲實際答案?我處於同樣的情況。 – Mike

2

在解決方案,我發現它在我的情況不理想再會時表示將要訪問的孩子,要改變那種表情是

iif(Child == null,null,Child.Name) ASC 

理論上講,該邏輯可以檢測被烘焙到動態庫中,我寧願不必修改每個網格來處理所有會影響的情況。

-2

我真的不明白的問題(也許是因爲它是星期五晚上在這裏已經...),但你不能對列表排序是這樣的:

myGrid.DataSource=repository.GetWidgetList() 
    .OrderBy(w => w.SortField).ToList(); 

哪裏是的SortField屬性你想排序。 這應該工作,即使值爲null ...

很抱歉,如果這也許完全跑題了...

+2

你完全錯過了這一點。既然你不是唯一的我一定沒有好好解釋自己。我更新了這個問題,以便稍微更清楚一點。 – JoshBerke

1

我有同樣的問題,但我找到了最好的解決辦法是讓你的代碼更通用的通過改變成這樣:

private void BindGrid() 
{ 
    var sortField = this._sortField; 
    var splitted_sortField = this._sortField.Split(new char[]{'.'}, StringSplitOptions.RemoveEmptyEntries); 
    if (splitted_sortField.Length > 1) 
    { 
     sortField = "iif("+splitted_sortField[0]+"==null,null,"+sortField+")"; 
    } 
    this.grid.DataSource = repository.GetWidgetList() 
            .OrderBy(sortField + " " + this._sortDirection) 
            .ToList(); 
} 

不完美,不喜歡給孩子的的兒童的訪問,但是每當你得到一個新的可空對象的孩子時,就不用更新你的代碼。