簡體   English   中英

動態LINQ表達式中的空引用異常

[英]Null Reference Exception in a Dynamic LINQ Expression

我正在使用Microsoft的Dynamic Linq Library / Sample在列表上進行排序。 例如,我有以下C#代碼:

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

我有一個案例,我的對象與另一個對象有0:1的關系,它有一個可能在網格中顯示的屬性。 當我們嘗試對它進行排序時,只要我的所有小部件都有這個孩子,它就能正常工作。 我們按Child.Name排序。 但是當Child為null時,我們得到null引用異常。

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

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

編輯

看起來我說得不夠好。 我使用的是帶有C#樣本Dynamic Linq庫 這個庫添加了一些很好的擴展,讓你在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();
}

雖然這是有效的,但現在這意味着我必須更新此代碼,因為我們要添加我們想要在子對象上的網格中公開的新字段或屬性。

如果我理解正確,我想你想要這個:

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

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

在解決方案中我發現在我的情況下再次不理想的是檢測表達式何時訪問子節​​點,將排序表達式更改為

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

理想情況下,這個邏輯可以融入到動態庫中,我寧願不必在整個地方修改每個網格來處理這會影響的所有情況。

我遇到了同樣的問題,但我找到的最佳解決方案是將代碼更改為通用代碼:

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();
}

不完美,不會喜歡讓孩子接觸孩子,但每次你得到一個新的可以自由的孩子時,都不會更新你的代碼。

我真的不明白這個問題(可能是因為它已經是星期五晚上了......),但你不能像這樣對列表進行排序:

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

其中SortField是您要排序的屬性。 即使值為null,這也應該有效...

對不起,如果它可能完全不合適......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM