2015-07-11 70 views
1

我有两个型号,其是如何获得连接表数据实体框架

public class Post 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string ShortDescription { get; set; } 
    public string PostImage { get; set; } 
    public string Thumbnail { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime? PublishedDate { get; set; } 
    public string CreatedBy { get; set; } 

    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

和产生CategoryPosts表。

这是我的问题:我想从CategoryPosts表中获取数据来计算热门类别。我如何获得这些数据?什么是最好的方式来做到这一点?

+0

如果需要,作为一个企业实体,把它定义为一个商业实体(定义类) – Amit

+0

反正是有解决这个问题的LINQ?我为什么要定义另一个班级? – sercanD

+0

A.为什么不呢? B.因为如果你想使用这样的实体的虚构,定义它 – Amit

回答

1

如果你想在热门类别,你不需要映射juction表中,可以通过邮寄的计数订购Categories

var query=yourContext.Categories.OrderBy(c=>c.Posts.Count); 

如果禁用了延迟加载,那么你应该调用包括之前的方法:

var query=yourContext.Categories.Include(c=>c.Posts).OrderBy(c=>c.Posts.Count); 

正如你可以看到下面,生成的SQL代码使用结合表来检查由标准各有Category和秩序Post计数:

SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name] 
FROM (SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    (SELECT 
     COUNT(1) AS [A1] 
     FROM [dbo].[PostCategories] AS [Extent2] 
     WHERE [Extent1].[Id] = [Extent2].[Category_Id]) AS [C1] 
    FROM [dbo].[Categories] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[C1] ASC 

当您需要添加附加列(不包括要加入的表的两个键)时,通常会映射联结表。在这种情况下,您需要在分别表和PostCaterogy之间分别创建两个一对多关系。

0

感谢奥克塔维奥,

我有这个想法,现在我可以很容易地得到这样的。

public List<Category> GetPopularCategories() 
    { 
    return _categoryRepository.GetAll().OrderBy(c => c.Posts.Count).ToList(); 
    }