c# - 如何按 child 的 child 的数量在 EF parent 中排序?

标签 c# sql sql-server entity-framework

我有 TeamCoderProjectTask

如何使用方法语法和 Code First 方法在 Entity Framework 中根据 Task 的数量对 Team 进行有效排序(可能无需加载子项的整个集合内容, 我只需要排序)?

public class MyAppContext : DbContext
{
    public DbSet<CTeam> Teams { get; set; }
    // ...etc
}

[Table("Team")]
public class CTeam
{

    public int ID { get; set; }

    [MaxLength(128)]
    public string Title { get; set; }

    [Display(Name = "Coders")]
    public virtual ICollection<CCoder> Coders { get; set; }
}



[Table("Coder")]
public class CCoder
{

    public int ID { get; set; }

    [MaxLength(128)]
    public string Name { get; set; }

    public virtual ICollection<CProject> Projects { get; set; }

    public int TeamID { get; set; }
    public virtual CTeam Team { get; set; }
}

//  CProject and CTask similarly

可选地,如果您可以提示原始 SQL 应该是什么样子,这也会有所帮助。谢谢!

更新

在具有关系的项目中 Builder -> NewBuildingObject -> NewBuildingHouse -> NewBuildingLayout

为了观众的方便,Teodor Ivanov 的回答是:

context.Teams
.OrderBy(x => x.Coders
   .SelectMany(y => y.Projects)
   .SelectMany(y => y.Tasks)
   .Count());

让 EF 生成这段代码:

SELECT 
    [Project1].[ID] AS [ID], 
    [Project1].[Title] AS [Title]
    FROM ( SELECT 
        [Extent1].[ID] AS [ID], 
        [Extent1].[Title] AS [Title], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM   [dbo].[NewBuildingObject] AS [Extent2]
            INNER JOIN [dbo].[NewBuildingHouse] AS [Extent3] ON [Extent2].[ID] = [Extent3].[ObjectID]
            INNER JOIN [dbo].[NewBuildingLayout] AS [Extent4] ON [Extent3].[ID] = [Extent4].[HouseID]
            WHERE [Extent1].[ID] = [Extent2].[BuilderID]) AS [C1]
        FROM [dbo].[Builder] AS [Extent1]
    )  AS [Project1]
    ORDER BY [Project1].[C1] ASC

Yacoub Massad 的回答:

var teams = context.Teams
    .OrderBy(team =>
        team.Coders.SelectMany(coder =>
            coder.Projects.SelectMany(project => project.Tasks)).Count());

制作了这段代码:

SELECT 
    [Project1].[ID] AS [ID], 
    [Project1].[Title] AS [Title]
    FROM ( SELECT 
        [Extent1].[ID] AS [ID], 
        [Extent1].[Title] AS [Title], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM  [dbo].[NewBuildingObject] AS [Extent2]
            INNER JOIN  (SELECT [Extent3].[ObjectID] AS [ObjectID]
                FROM  [dbo].[NewBuildingHouse] AS [Extent3]
                INNER JOIN [dbo].[NewBuildingLayout] AS [Extent4] ON [Extent3].[ID] = [Extent4].[HouseID] ) AS [Join1] ON [Extent2].[ID] = [Join1].[ObjectID]
            WHERE [Extent1].[ID] = [Extent2].[BuilderID]) AS [C1]
        FROM [dbo].[Builder] AS [Extent1]
    )  AS [Project1]
    ORDER BY [Project1].[C1] ASC

最佳答案

你可以尝试类似的东西

context.Teams
.OrderBy(x => x.Coders
   .SelectMany(y => y.Projects)
   .SelectMany(y => y.Tasks)
   .Count());

关于c# - 如何按 child 的 child 的数量在 EF parent 中排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164694/

相关文章:

sql - 如何以交叉的方式确定行之间的月份差异

c# - 类代替接口(interface)失败

MySQL日期转换错误

链接表上的 SQL 索引策略

C# SqlReader 问题

sql-server - 在 Service Broker 中向服务添加契约(Contract)后

c# - WinRT gridview 添加磁贴

c# - Sum List<T> List<T> 中每一项的属性

c# - 不能对空值调用此方法或属性。数据为空

sql-server - SSRS 2008 报告订阅电子邮件随机收到传递扩展加载错误