Linq-to-Entities, работающие с отношением «один ко многим» и сортировкой - PullRequest
1 голос
/ 02 июля 2011

Я бы хотел отсортировать ключевые слова по свойству сортировки. У меня есть отношение «один-много» между страницей -> ключевое слово.

Вопрос: Если я выполню запрос на понимание как:

IEnumerable<page> query = from p in contxt.pages where p.ID == myId select p;

IEnumerable<page> pge = query.First();

Могу ли я рассчитывать на набор из одной страницы со всеми свойствами страницы и одним набором ключевых слов?

Насколько я понимаю, поскольку существуют отношения один-много, мне не нужно выполнять соединение. Платформа Linq to Entity должна знать об этих отношениях и возвращать коллекцию.

Так что это мое понимание, поэтому, когда я пытаюсь отсортировать ключевое слово.sort, ключевое слово выходит за рамки:

    IEnumerable<page> query = from p in contxt.pages where p.ID == myId
orderby p.keywords. select p;

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

    PageKeywords pageKeywords = new PageKeywords();
    Keywords keywords;

    IEnumerable<page> query = from p in contxt.pages 
where p.ID == vals.pageId select p;

    page pge = query.First();

    pageKeywords.keywords = new List<Keywords>();

    pageKeywords.id = pge.ID;
    pageKeywords.description = pge.descp;
    pageKeywords.title = pge.title;
    pageKeywords.showTitle = pge.showTitle;
    pageKeywords.keywords = pge.keywords.OrderBy(k => k.sort);

    foreach (var item in pageKeywords.keywords)
    {
    keywords = new Keywords();
    keywords.id = item.id;
    keywords.name = item.name;
    keywords.sort = item.sort;
    pageKeywords.keywords.Add(keywords);
    }

Однако это не сработало. Ключевые слова не были отсортированы по сортировке? Приведенный выше код работает, однако мне нужно отсортировать ключевые слова по свойству сортировки. Коллекция ключевых слов не сортируется.

Я тоже пробовал:

pageKeywords.keywords.Sort((x, y) => int.Compare(x.sort, y.sort));

Что не сработало.

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

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 июля 2011

Попробуйте это:

var query = from p in contxt.Pages 
            where p.ID == vals.PageId 
            select new PageKeywords 
                {
                    Id = pge.Id,
                    Description = pge.Descp,
                    Title = pge.Title,
                    ShowTitle = pge.ShowTitle,
                    Keywords = pge.Keywords.OrderBy(k => k.sort)
                };
0 голосов
/ 02 июля 2011

OrberBy возвращает новое перечисляемое значение - оно не меняет источник: http://msdn.microsoft.com/en-us/library/bb534966.aspx

Кроме того, вы хотите отсортировать по свойству ключевых слов, на странице может быть много ключевых слов, вам нужно выбрать одно (например, минимум один).

Попробуйте:

IEnumerable<page> query = context.pages // Pages
    .Where(p => p.ID == myId) // Filtered by id
     // Sort by minimum sort value of all keywords of page
    .OrderBy(p.Keywords.Select(keyword => keyword.sort).Min());

Кроме того, рекомендуется использовать рекомендации для имен в .NET (например, свойства должны быть PascalCase, а не camelCase).

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