我正在使用Microsoft的Dynamic Linq库/示例来对列表进行订购。因此,例如,我有以下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();
}
并且尽管这可行,但现在这意味着我必须更新此代码,因为我们要添加要在网格中显示在子对象上的新字段或属性。