LINQ Select 对象基于对象列表中的 属性

LINQ Select Object based on a property within a list within the object

我正在尝试 select 对象列表中的对象列表,该对象列表本身具有基于该对象列表中的 属性 的另一种类型的对象列表。

例如

class TypeA{
  string Name {get; set;}
  List<TypeB> ListOfTypeB {get; set;}
}

class TypeB{
  int Age {get; set;}
  bool Active {get; set;}
}

我有一个由数据库填充的类型 A 列表,我想查询类型 A 列表和 Return 基于类型 B 中的活动 属性 的类型 A 列表TypeA 对象中的列表。

任何帮助都会很棒。

谢谢

这将取决于您实际如何实现过滤器逻辑。如果你想找到类型 A 的列表,其中类型 B 包含至少一个活动标志,那么你可以像下面那样做。

listOfTypeA.Where(a => a.ListOfTypeB.Any(b => b.Active)).ToList();

您写道:

I want to query the list of TypeA and Return a List of TypeA based on the Active property in TypeB.

这个规范有点不清楚。我假设您的意思是您想要所有 TypeA 个对象,这些对象至少有一个 TypeB 个对象具有真值 TypeB.Activity(或那些具有假值的对象)。

答案取决于您要以 Enumerable 还是 Queryable 的形式执行查询。换句话说:是先把对象拿到本地​​内存再查询(AsEnumerable)还是让数据库查询(Asqueryable)然后只查询[=81] =] 将有效结果保存到本地内存。

AsEnumerable

这种方法不是很有效,因为这意味着您在处理之前将完整的 TypeA 和 TypeB table 获取到本地内存。

但是您的查询很简单:

var AwithActivity = allTypeA
    .Where(a => a.ListOfTypeB.Any(b => b.Activity));

换言之:

typeA 个元素的完整序列中,只取那些 typeA 个元素,其中至少有一个 ListOfTypeB 个元素的值为 属性 [=24] =].

AsQueryable

如果您的数据库设置正确,您将有两个 table。一个 table 有 TypeA 个项目,一个 table 有 TypeB 个项目。

TypeATypeB是一对多的关系。每个 TypeA 有零个或多个 TypeB 并且每个 TypeB 恰好属于一个 TypeA.

在您的数据库中,TypeATypeB 都有一个主键。每个 TypeB 都会有一个指向它所属的 TypeA 的外键。

这是相当标准的数据库。它可以帮助您进行查询。使用这些定义,您的查询将被翻译成:

I want all TypeA objects of which there is at least one TypeB object that has a foreign key to this TypeA object AND a true value for Activity

查询将是:

var results = TypeATable            // groupjoin table TypeA with table TypeB
    .GroupJoin(TypeBTable,
      typeA => typeA.PrimaryKey,    // from every typeA use the primary key
      typeB => typeB.ForeignKey,    // from every typeB use the foreign key to the TypeA
      (a, allB) => new              // for every A with all matching typeB:
      {                             // create a new anonymous type
         A = a,                     // with the found A
         HasActivity = allB         // and a boolean that says if there was
            .Any(b => b.Activity),  // at least one B with a true Activity
      });

要得到至少有一个的所有TypeA activity:

var AWithActivity = results.Where(result => result.HasActivity)
   .Select(result => result.A);

获取所有完全没有 activity 的 TypeA:

var AwithoutActivity = result.Where(result => !result.HasActivity)
   .Select(result => result.A);

加法 如果可能是 typeA 和 typeB 之间的关系不是一对多,而是多对多。在这种情况下,您获取所有活动的 typeB 对象并找到所有具有该活动 typeB 对象的外键的 typeA 对象