Использовать Take для включения объекта - PullRequest
0 голосов
/ 31 марта 2011

У меня есть две таблицы: категории и статьи. Одна категория может иметь много статей. Я хочу отобразить обзор новых статей, разделенных по категориям. Но я хочу отображать только первые пять статей в каждой категории. Как мне написать запрос для решения этой проблемы?

Моей первой идеей было что-то вроде этого:

var cat = from c in ctx.categories
          where c.IsPublic == true
          select c;

Но это содержит все статьи, и я не уверен, как написать что-то вроде c.articles.Take (5) для запроса Возможно ли это?

Да, и это ASP.NET MVC 2 с Entity Framework.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Это сработало для меня.Здесь важно отключить отложенную загрузку, чтобы избежать загрузки всех статей при выполнении итерации по коллекции:

ctx.ContextOptions.LazyLoadingEnabled = false; // assuming you are in EF 4.0

var query = ctx.categories
    .Where(c => c.IsPublic)
    .Select(c => new { 
        Category = c, 
        Articles = c.Articles.Take(5)
    }).ToList().Select(x => x.Category);

foreach (var category in query)
{
    foreach (var article in category.Articles)
    {
        // runs only 5 times through this loop
    }
}

Редактировать

Если вы не утилизируетеctx и больше работайте с контекстом после приведенного выше фрагмента кода, возможно, вам лучше снова включить отложенную загрузку ...

ctx.ContextOptions.LazyLoadingEnabled = true;

... прежде чем возникнут проблемы с другими запросами, если ваше приложение в основном полагается наленивая загрузка.

0 голосов
/ 31 марта 2011
ctx.categories
    .Where(c => c.IsPublic)
    .Select(c => new 
    { 
        Category = c, 
        Articles = c.Articles.OrderBy(a => a.Whatever).Take(5)
    ).Select(c => c.Category);

Предположим, что вашим именем класса является Category с коллекцией EntityCollection под названием Articles, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...