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
个项目。
TypeA
与TypeB
是一对多的关系。每个 TypeA
有零个或多个 TypeB
并且每个 TypeB
恰好属于一个 TypeA
.
在您的数据库中,TypeA
和 TypeB
都有一个主键。每个 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 对象
我正在尝试 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
个项目。
TypeA
与TypeB
是一对多的关系。每个 TypeA
有零个或多个 TypeB
并且每个 TypeB
恰好属于一个 TypeA
.
在您的数据库中,TypeA
和 TypeB
都有一个主键。每个 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 对象