c# - 动态 LINQ 表达式中的空引用异常

标签 c# linq dynamic-linq

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

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

我有一个案例,我的对象与另一个对象具有 0:1 的关系,该对象具有可能显示在网格中的属性。当我们尝试对此进行排序时,只要我所有的小部件都有这个 child ,它就可以正常工作。例如,我们按 Child.Name 排序。但是,当 Child 为 null 时,我们会得到 null 引用异常。

我在这里有一些选项,我知道我可以选择匿名类型并绑定(bind)到它,我也可以在父对象上公开 Child.Name 并通过代码处理它(我不喜欢包含我的对象模型)。

在理想情况下,我想更新库来处理这种情况。在我深入研究之前,我想知道是否有人遇到过这个问题并且已经有了解决方案?

编辑

看来我解释得不够好。我正在使用 Dynamic Linq Library C# samples 附带的.这个库添加了一些很好的扩展,让你可以使用字符串代替 lambda 表达式所以我的代码实际上是这样的:

private  void BindGrid(sortField,sortDirection)
{

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

当然那里的字符串被参数替换了。但这允许我们在用户单击网格标题时动态更改排序。我们不必使用 if then else 逻辑来处理所有排列。

我在下面记录的解决方案将我的 nice clean 方法更改为:

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。

关于c# - 动态 LINQ 表达式中的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444851/

相关文章:

C# Linq GroupBy,获取每个组中的列列表

c# - Linq Multiple OR 与列表

c# - Dynamic Linq 的执行延迟 IQueryable<T>?

linq - 动态 LINQ : Comparing Nested Data With Parent Property

c# - 从 BindingExpression 获取源属性类型

c# - 将进度条绑定(bind)到 wpf 中的媒体元素

c# - 有没有办法将 Html 插入到 gridview 行中?

c# - 参数类型 System.Linq.IQueryable<> 不可分配给参数类型 Systems.collection.generic.ienumerable

c# - WPF 应用程序在未右键单击并选择 "Run as administrator"的情况下运行时出现性能问题

c# - 动态 Linq 在 GroupBy 之后选择组中的第一个