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