2011-04-09 41 views
3

帽兒元素的數目我有兩個數據模型博客。 BlogId是在實體框架4 - 如何從另一個表(通過外鍵連接)

public class Blog 
{ 
    public int ID { get; set; } 

    public string Title { get; set; } 

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

    ... 
} 


public class Post 
{ 
    public int ID { get; set; } 

    public virtual int BlogId { get; set; } 

    public string Title { get; set; } 

    ... 
} 

外鍵現在這工作得很好,我的倉庫是快樂和拉從DB期望的一切。

我的問題是 - 有沒有辦法限制數量的帖子得到檢索。也許一些LINQ魔術?

這裏是我目前在庫的方法是這樣的:

public Business FindBlog(int id) 
{ 
    return this.context.Get<Blog>().SingleOrDefault(x => x.ID == id); 
} 

回答

3

可惜的是EFv4不提供簡單的方法來限制導航返回的記錄數屬性。

如果您正在使用EntityObject派生實體,你可以使用這樣的:如果你正在使用波蘇斯

var blog = context.Blogs 
        .Single(b => b.Id == blogId); 

var posts = blog.Posts 
       .CreateSourceQuery() 
       .OrderByDescending(p => p.Date) 
       .Take(numberOfRecords) 
       .ToList(); 

你必須爲執行單獨的查詢(如果代理波蘇斯你可以convert navigation propertyEntityCollection<Post>以訪問到CreateSourceQuery):

var blog = context.Blogs 
        .Single(b => b.Id == blogId); 

var posts = context.Posts 
        .Where(p => p.BlogId == blogId) 
        .OrderByDescending(p => p.Date) 
        .Take(numberOfPosts) 
        .ToList(); 

EFv4.1和的DbContext API提供加載相關實體的只有數量有限的方式:

var blog = context.Blogs 
        .Single(b => b.Id == blogId); 

context.Entry(blog) 
     .Collection(b => b.Posts) 
     .Query() 
     .OrderByDescending(p => p.Date) 
     .Take(numberOfPosts) 
     .Load(); 

編輯:

你可以用投影做單查詢:

var blog = context.Blogs 
        .Where(b => b.Id == blogId) 
        .Select(b => new 
         { 
          Blog = b, 
          Posts = b.Posts 
            .OrderByDescending(p => Date) 
            .Take(numberOfRecords) 
         }) 
        .SingleOrDefault() 

要知道,你必須從匿名類型的第二paremeter訪問的職位。

+0

謝謝拉迪斯拉夫。我正在使用POCO,而且我在這裏做了類似於您的建議的事情。但是,如果我可以在一次去DB_的情況下做到這一點,我就會喜歡它。 – zuniga 2011-04-09 22:52:51

+0

@zuniga:我添加了單個查詢的版本。 – 2011-04-09 23:12:42

+0

@Ldislav - 工作! – zuniga 2011-04-11 18:55:53

0

你的意思是:

public List<Post> GetBlogPosts(Blog blog, int numberOfPosts) 
{ 
    return blog.Posts.Take(numberOfPosts); 
} 
+0

我認爲只需在結果(包含與博客相關的所有帖子)從數據庫中提取後,只需選擇_numberOfPosts_帖子即可。我希望實際上只能從數據庫中提取_numberOfPosts_。 – zuniga 2011-04-09 06:11:45