LINQ基于对象中列表中的特性选择对象
我试图从一个对象列表中选择一个对象列表,该对象列表基于对象列表中的属性,在其自身中有另一种类型的对象列表 比如说LINQ基于对象中列表中的特性选择对象,linq,linq-to-entities,Linq,Linq To Entities,我试图从一个对象列表中选择一个对象列表,该对象列表基于对象列表中的属性,在其自身中有另一种类型的对象列表 比如说 class TypeA{ string Name {get; set;} List<TypeB> ListOfTypeB {get; set;} } class TypeB{ int Age {get; set;} bool Active {get; set;} } A类{ 字符串名称{get;set;} 类型{get;set;}的列表列表 } B类{
class TypeA{
string Name {get; set;}
List<TypeB> ListOfTypeB {get; set;}
}
class TypeB{
int Age {get; set;}
bool Active {get; set;}
}
A类{
字符串名称{get;set;}
类型{get;set;}的列表列表
}
B类{
int Age{get;set;}
bool活动{get;set;}
}
我有一个由数据库填充的类型a列表,我想查询类型a列表,并根据类型B中的活动属性返回类型a列表,该属性是类型a对象中的列表
任何帮助都会很好
谢谢这将取决于您实际如何实现过滤器逻辑。如果您想找到类型A的列表,其中类型B至少包含一个活动标志,则可以执行以下操作
listOfTypeA.Where(a => a.ListOfTypeB.Any(b => b.Active)).ToList();
这将取决于您实际如何实现过滤器逻辑。如果您想找到类型A的列表,其中类型B至少包含一个活动标志,则可以执行以下操作
listOfTypeA.Where(a => a.ListOfTypeB.Any(b => b.Active)).ToList();
你写道:
我想查询TypeA列表并返回一个基于
TypeB中的活动属性
这个规格有点不清楚。我假设您的意思是希望所有TypeA
对象至少有一个TypeB
对象具有真值TypeB.Activity
(或具有假值的对象)
答案取决于您希望以可枚举
或可查询
的方式执行查询。换句话说:您是先将对象放入本地内存,然后执行查询(AsEnumerable
),还是让数据库执行查询(Asqueryable
),然后只将有效结果返回到本地内存
可计算的
这种方法不是很有效,因为这意味着在处理之前,要将完整的TypeA和TypeB表放到本地内存中
但是,您的查询很简单:
var AwithActivity = allTypeA
.Where(a => a.ListOfTypeB.Any(b => b.Activity));
简言之:
从typeA
元素的完整序列中,只取那些typeA
元素,这些元素至少有一个ListOfTypeB
元素的属性Activity
值为真
AsQueryable
如果数据库设置正确,将有两个表。一个表包含TypeA
项,一个表包含TypeB
项
TypeA
与TypeB
有一对多关系。每个TypeA
都有零个或多个TypeB
,每个TypeB
都只属于一个TypeA
在数据库中,TypeA
和TypeB
都有主键。每个TypeB
都会有一个外键指向它所属的TypeA
这是相当标准的数据库。它有助于您的查询。使用这些定义,您的查询将转换为:
我想要所有TypeA对象,其中至少有一个TypeB对象具有该TypeA对象的外键和活动的真值
查询将是:
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,请执行以下操作:
var AWithActivity = results.Where(result => result.HasActivity)
.Select(result => result.A);
要获取完全没有活动的所有TypeA,请执行以下操作:
var AwithoutActivity = result.Where(result => !result.HasActivity)
.Select(result => result.A);
添加
a型和B型之间的关系不是一对多,而是多对多。在这种情况下,您将获取所有活动的typeB对象,并找到所有带有此活动typeB对象外键的typeA对象
我想查询TypeA列表并返回一个基于
TypeB中的活动属性
这个规格有点不清楚。我假设您的意思是希望所有TypeA
对象至少有一个TypeB
对象具有真值TypeB.Activity
(或具有假值的对象)
答案取决于您希望以可枚举
或可查询
的方式执行查询。换句话说:您是先将对象放入本地内存,然后执行查询(AsEnumerable
),还是让数据库执行查询(Asqueryable
),然后只将有效结果返回到本地内存
可计算的
这种方法不是很有效,因为这意味着在处理之前,要将完整的TypeA和TypeB表放到本地内存中
但是,您的查询很简单:
var AwithActivity = allTypeA
.Where(a => a.ListOfTypeB.Any(b => b.Activity));
简言之:
从typeA
元素的完整序列中,只取那些typeA
元素,这些元素至少有一个ListOfTypeB
元素的属性Activity
值为真
AsQueryable
如果数据库设置正确,将有两个表。一个表包含TypeA
项,一个表包含TypeB
项
TypeA
与TypeB
有一对多关系。每个TypeA
都有零个或多个TypeB
,每个TypeB
都只属于一个TypeA
在数据库中,TypeA
和TypeB
都有主键。每个TypeB
都会有一个外键指向它所属的TypeA
这是相当标准的数据库。它有助于您的查询。使用这些定义,您的查询将转换为:
我想要所有TypeA对象,其中至少有一个TypeB对象具有该TypeA对象的外键和活动的真值
查询将是:
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,请执行以下操作:
var AWithActivity = results.Where(result => result.HasActivity)
.Select(result => result.A);
要获取完全没有活动的所有TypeA,请执行以下操作:
var AwithoutActivity = result.Where(result => !result.HasActivity)
.Select(result => result.A);
添加
a型和B型之间的关系不是一对多,而是多对多。在这种情况下,您获取所有活动的typeB对象,并找到所有带有此活动typeB对象外键的typeA对象您好,是的,您的正确性,我重新阅读了我的答复