c# - 在 lambda 表达式中的另一个对象列表中获取一个对象列表

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

我有以下类(class):

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 */)

关于c# - 在 lambda 表达式中的另一个对象列表中获取一个对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694564/

相关文章:

c# - 如何在不滚动的情况下查找文本框中适合的文本量

c# - 最适合我目的的正则表达式

c# - 数据库中的 Asp.net MVC 页面标题

javascript - MVC 4 中的数据注释不显示错误消息

entity-framework - Entity Framework 5 模型优先 - IDisposable 去哪儿了?

c# - 是否可以通过 Visual Studio Code 创建 Windows 服务?

c# - WCF 客户端缓存 Windows 身份验证

asp.net - Entity Framework 6 EntityDataSource 未在 DbContext 中调用 SaveChanges

javascript - 使用带有文本框检查的 JQuery 更新表行,我需要检查文本框值

entity-framework - 没有外键的 Entity Framework 代码优先映射