Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ基于对象中列表中的特性选择对象_Linq_Linq To Entities - Fatal编程技术网

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对象

您好,是的,您的正确性,我重新阅读了我的答复