我有以下课程:
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对象列表,它来自用户的选择。
让我们说用户选择了Ids 1和3的ClassC。我需要返回符合条件的所有ClassA对象的列表。
答案 0 :(得分:4)
当您拥有集合集合并且希望在内部返回集合元素时,一般规则是在进行进一步处理之前使用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 */)
答案 1 :(得分:1)
您可以使用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));
答案 2 :(得分:0)
listOfObjectsOfClassA.Where(a => a.ClassBs
.Where(b => listOfUserProvidedIds.Contains(b.ClassCId))
.Count() > 0)
.ToList()
除非我误解了某些内容,否则应该按照您的要求行事。
这样做,获取ClassA
个对象的列表,浏览每个ClassB
对象内的ClassA
列表,并检查用户提供的ID列表(在您的该列表包含1
和3
)的示例包含分配给特定ClassCId
对象的ClassB
。