2013-04-30 59 views
0

在特定的情況下返回非IQueryable的價值我在寫這個方法通過類別ID返回一個帖子:通過LINQ

public Post GetPostByCategory(Guid categoryId) 
     { 
      var query= _siteContext.Posts.Where(p => p.Category.Id == categoryId) 
            .OrderByDescending(p => p.CreationDate); 
      return query;//Error 
     } 

我只是想通過一個類型後的返回查詢,查詢必須, 我能做什麼 ??

我不希望返回後的名單像這樣

public IList<Post> GetPostByCategory(Guid categoryId) 
      { 
       var query= _siteContext.Posts.Where(p => p.Category.Id == categoryId) 
             .OrderByDescending(p => p.CreationDate); 
       return query.tolist(); 
      } 

我已經somthine之前通過NHibernate的做這樣的:

public int TotalPostsForCategory(string categorySlug) 
     { 
      return _session.Query<Post>() 
         .Where(p => p.Published && p.Category.UrlSlug.Equals(categorySlug)) 
         .Count(); 
     } 

我怎樣才能做到這一點與實體框架? ??

回答

2

你可以使用FirstSingle這樣的:

public Post GetPostByCategory(Guid categoryId) 
{ 
    var query= _siteContext.Posts.Where(p => p.Category.Id == categoryId) 
         .OrderByDescending(p => p.CreationDate); 
    return query.First(); 
} 

public Post GetPostByCategory(Guid categoryId) 
{ 
    var query= _siteContext.Posts.Where(p => p.Category.Id == categoryId) 
         .OrderByDescending(p => p.CreationDate); 
    return query.Single(); 
} 

http://msdn.microsoft.com/en-us/library/bb348657.aspxhttp://msdn.microsoft.com/en-us/library/bb156472.aspx

+0

不會使用更好'FirstOrDefault'或'SingleOrDefault',所以你不會拋出'ArgumentNullException'或'InvalidOperationException'? – 2013-04-30 12:06:19

+0

這取決於用例,並且你是否除了null – Xharze 2013-04-30 12:47:15

+0

啊,那麼你的return'object'應該是'Nullable '。 – 2013-04-30 12:51:35

2

您必須使用FirstOrDefault()擴展方法只返回第一個元素:

public Post GetPostByCategory(Guid categoryId) 
{ 
    var firstPost = _siteContext.Posts 
           .Where(p => p.Category.Id == categoryId) 
           .OrderByDescending(p => p.CreationDate) 
           .FirstOrDefault(); 
    return firstPost; 
} 

的FirstOrDefault將是在SQL查詢中的TOP 1更換。
查詢應該是喜歡這樣的:

SELECT TOP 1 p.* 
FROM Posts p 
WHERE p.CategoryId = categoryId 
ORDER BY p.CreationDate DESC