首页 > 解决方案 > 多对象类型嵌套 LINQ 查询

问题描述

我正在填充我的 xaml 绑定一个ObservableCollection<FrameworkElement>称为DaysCollection到一个ItemsControl's ItemSource

我在列表中推送的对象是类型Day 每个对象都有一个类似的结构:一个ItemsControl填充ItemSource有对象的Things对象,这些对象具有一个 TimeStamp 属性。

我正在尝试使用 LINQ 在DaysCollectionThings列表中查找包含正确时间戳的对象。

我尝试了以下方法:

var test = DaysCollection .Where(x => (x.DataContext as List<Days>).Any(y => (y.DataContext as List<Things>).Any(z => z.TimeStamp == value))).First();

但我得到了错误:

System.ArgumentNullException: 'Value cannot be null.
Parameter name: source'

标签: c#linqobservablecollection

解决方案


由于as类型转换操作可以在类型不多时返回 null,因此后续调用.Any()可能会导致上述异常。

您绝对确定 DataContext 内部是 TypeList<Days>吗?如果不是,请尝试使用IEnumerable<Days>,它允许更广泛的集合实现选择。

此外,您应该使用 null 条件 ( ?.) 和 null 合并 ( ??) 运算符检查强制转换是否为 null。下面的代码可能有效,但您可能需要更多括号。;)

.First()确保您收到至少一个且恰好是一个元素。(虽然集合中可能还有更多。)如果您的查询没有返回结果,这也会引发异常。.FirstOrDefault()如果您想自己处理这种情况,您可能想要使用。

var test = DaysCollection
  .Where(x => (x.DataContext as IEnumerable<Days>)
    ?.Any(y => (y.DataContext as IEnumerable<Things>)
      ?.Any(z => z.TimeStamp == value) ?? false)
    ?? false
  ).First();

推荐阅读