在lamba表达式中的另一个对象列表中获取对象列表
本文关键字:列表 获取 取对象 一个对象 lamba 表达式 | 更新日期: 2023-09-27 18:21:45
我有以下类:
public class ClassA(){
public int Id { get; set; }
public ICollection<ClassB> ClassBs{ get; set; }
}
public class ClassB(){
public int Id { get; set; }
public int ClassAId{ get; set; }
public int ClassCId{ get; set; }
public virtual ClassA ClassA{ get; set; }
public virtual ClassC ClassC{ get; set; }
}
public class ClassC(){
public int Id { get; set; }
public string Name{ get; set; }
public ICollection<ClassB> ClassBs{ get; set; }
}
现在,我有一个ClassC对象的列表,它来自用户的选择。
假设用户选择了ID为1和3的ClassC。我需要返回所有符合条件的ClassA对象的列表。
当您有一个集合集合,并且您希望在内部返回该集合的元素时,通常的规则是在进行进一步处理之前使用SelectMany
。在您的情况下,这将看起来如下:
var res = collectionOfCs
.Where(cItem => ... /* Condition on ClassC */)
.SelectMany(cItem => cItem.ClassBs.Select(bItem => bItem.ClassA))
.Where(aItem => ... /* Condition on ClassA */)
您可以将ClassA
和SelectMany
的选择分开,但查询的整体结构将保持不变:
var res = collectionOfCs
.Where(cItem => ... /* Condition on ClassC */)
.SelectMany(cItem => cItem.ClassBs)
.Select(bItem => bItem.ClassA) // Moved from SelectMany
.Where(aItem => ... /* Condition on ClassA */)
您可以使用SelectMany
扩展方法:
var query = listOfClassC.Where(c => c.Id == 1 || c.Id == 3)
.SelectMany(c => c.ClassBs.Select(b => b.ClassA));
现在,为了更好地过滤类型为ClassC
的对象,您也可以使用Contains
方法:
var ClassCIds=new List<int>(){1,3}; // Add here the ids what you want to filter
var query = listOfClassC.Where(c => ClassCIds.Contains(c.Id))
.SelectMany(c => c.ClassBs.Select(b => b.ClassA));
listOfObjectsOfClassA.Where(a => a.ClassBs
.Where(b => listOfUserProvidedIds.Contains(b.ClassCId))
.Count() > 0)
.ToList()
这应该符合你的要求,除非我误解了什么。
这样做的目的是,获取ClassA
对象的列表,遍历每个ClassA
对象内部的ClassB
列表,并检查用户提供的ID列表(在您的示例中,该列表将包含1
和3
)是否包含分配给特定ClassB
对象的ClassCId
。