我正在使用 Microsoft 的 Dynamic Linq Library/Sample 在列表中进行排序。例如,我有以下 C# 代码:
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
我的对象与另一个对象具有 0:1 关系,该对象具有可能显示在网格中的属性。当我们尝试对此进行排序时,只要我所有的小部件都有这个孩子,它就可以正常工作。例如,我们正在订购Child.Name
。但是,当 Child 为 null 时,我们会得到 null 引用异常。
我在这里有一些选项,我知道我可以选择匿名类型并绑定到它,我还可以在父对象上公开 Child.Name 并通过代码处理它(我不喜欢为此包含我的对象模型)。
在一个理想的世界中,我想更新库来处理这种情况。在我深入研究之前,我想知道是否有人遇到过这个问题并且已经有了解决方案?
编辑
看来我解释得不够清楚。我正在使用C# 示例附带的动态 Linq 库。这个库添加了一些不错的扩展,让您可以使用字符串代替 lambda 表达式所以我的代码实际上是这样的:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
当然,那里的字符串被参数替换。但这允许我们在用户单击网格标题时动态更改排序。我们不必使用 if then else 逻辑来处理所有排列。
我在下面记录的解决方案将我的干净方法更改为:
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();
}
虽然这可行,但现在这意味着我必须更新此代码,因为我们添加了我们想要在子对象上的网格中公开的新字段或属性。