2013-04-30 3 views
0

в конкретном случае, я пишу этот метод, чтобы вернуть пост по категориям Id:возвращает значение Non IQueryable с помощью LINQ

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

Я просто хочу, чтобы вернуть запрос, сусло запроса по типу Post , что я могу сделать ??

Я не хочу, чтобы вернуть список пост, как этот

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(); 
     } 

Как я могу сделать это с помощью Entity Framework? ??

ответ

2

Вы можете использовать First или Single вроде этого:

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.aspx и http://msdn.microsoft.com/en-us/library/bb156472.aspx

+0

бы это не лучше использовать 'FirstOrDefault' или' SingleOrDefault', поэтому вы не бросаете 'ArgumentNullException' или' InvalidOperationException'? –

+0

Это зависит от используемого варианта, и за исключением нуля – Xharze

+0

Ах, тогда ваш возвращаемый 'объект' должен быть' Nullable '. –

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 будет заменить на ТОП 1 в запросе SQL.
запрос должен выглядеть любит это:

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