Linq To Sql, комплексный выбор - PullRequest
       2

Linq To Sql, комплексный выбор

1 голос
/ 16 декабря 2011

Я строю портал (это мой хобби-проект), и для моей индексной (домашней) страницы мне нужно написать конкретный запрос.

Я хочу получить категории в указанном порядке. Для каждой категории я хочу загрузить N самых последних статей, которые прилагаются к ней. Так что в основном моя домашняя страница будет выглядеть так

Category 1            Category 2
Article title 1       Article title 1
Article title 2       Article title 2
....                  ....
Article title N       Article title N


Category 3            Category 4
Article title 1       Article title 1
Article title 2       Article title 2
....                  ....
Article title N       Article title N

Моя упрощенная модель предметной области выглядит следующим образом:

public class CategoryInfo
{
    public virtual Int64 ParentId? { get; set; }

    public virtual String Name { get; set; }

    public virtual Int32 DisplayOrder { get; set; }

    public virtual ICollection<ArticleInfo> Articles { get; set; }
}

public class ArticleInfo
{
    public virtual String Title { get; set; }

    public virtual DateTime Published { get; set; }

    public virtual Int64? CategoryId { get; set; }

    public virtual CategoryInfo { get; set; }
}

Категория может иметь много статей, связанных с ней. Статья может быть без рубрики.

Итак, я пытаюсь сделать это следующим образом:

var query = _categoryService.GetCategories().Where(x => !x.ParentId.HasValue) // Getting only top level categories
                                            .OrderBy(x => x.DisplayOrder)     // Sorting
                                            .Select(x => x.Articles.OrderByDesc(a => a.Published).Take(N))

Это не работает. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Вы можете сделать это, используя SelectMany следующим образом:

categories.Where(x => !x.ParentId.HasValue) // Getting only top level categories
            .OrderBy(x => x.DisplayOrder) // Sorting
            .SelectMany(x => x.Articles.OrderByDescending(a => a.Published).Take(10))
            .GroupBy(x => x.Category);

Вы можете повторить это так:

        foreach (var group in query)
        {
            Console.Write(group.Key); //the category
            //group is an enumerable of articles
        }
0 голосов
/ 16 декабря 2011

Я думаю, что правильный подход будет:

var query = _categoryService.GetCategories().Where(x => !x.ParentId.HasValue) // Getting only top level categories
                                            .OrderBy(x => x.DisplayOrder)     // Sorting
                                            .Select(x => new {
Category = x,
Articles = x.Articles.OrderByDesc(a => a.Published).Take(N))
});

Результатом будет коллекция анонимных объектов.Каждый объект будет иметь 1 объект Category и коллекцию связанных объектов Articles.Это может стать вашей моделью дисплея.

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