获取lamba表达式中另一个对象列表中的对象列表

时间:2015-11-13 14:05:42

标签: c# asp.net-mvc entity-framework

我有以下课程:

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对象的列表。

3 个答案:

答案 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列表(在您的该列表包含13)的示例包含分配给特定ClassCId对象的ClassB