2016-02-02 126 views
3

S的编码器小号项目 S的任务 S的。如何根据儿童孩子的人数排序EF父母?

如何有效地排序 01用任务 S IN实体框架的使用方法的语法和代码优先的方法号(可能没有加载儿童儿童的整个集合内容,我需要那种只)?

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应该怎么看起来像这个,这将有助于太。谢谢!

UPDATE

与关系Builder -> NewBuildingObject -> NewBuildingHouse -> NewBuildingLayout

对于观众的舒适,特奥多尔·伊万诺夫的回答一个项目:

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 

雅各布·马萨德的回答是:

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 

回答

3

你可以尝试像

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

谢谢!您的解决方案运行良好。我最早接受这个答案。 – Roman

2

您可以使用SelectMany这样的:

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

谢谢!您的解决方案运行良好。 – Roman