C # и LINQ: упорядочение запроса по значению вложенного запроса - PullRequest
2 голосов
/ 22 августа 2011

Я пишу простой форум в ASP.NET, который находится поверх базы данных Entity Framework в C #.

Каждый Topic объект имеет свойство навигации Posts, указывающее на коллекцию Post предметов.Каждый объект Post имеет свойство When, которое указывает, когда было сделано сообщение.

Post.Parent имеет тип Topic.Post.Identifier и Topic.Identifier - это тип Int32.Только Post имеет свойство When;Topic не имеет такого свойства.Topic.Parent - это третий тип Forum, на который ссылается его Identifier.

Моя проблема заключается в следующем: я не могу найти способ сортировки всех объектов Topic по last пост сделан в каждой теме.Я пробовал это:

var topics = from t in context.Topics
             from p in a.Posts
             where t.Parent.Identifier == forum.Identifier
             orderby p.When descending
             select t;

Но я получил дубликаты Topic объектов и сортировка была не по дате последней публикации по убыванию.

Затем я попробовал это:

var topics = (from t in context.Topics
              let lastPost =
                  (from p in context.Posts
                   where p.Parent.Identifier == a.Identifier
                   orderby p.When descending
                   select p).FirstOrDefault().When
              where t.Parent.Identifier == forum.Identifier
              orderby lastPost descending
              select t).Distinct();

Это устранило проблему дублирования, но все еще не сортировало.Я даже попробовал предложение из другого вопроса :

var topics = (from t in context.Topics
              let posts = context.Posts.Where(p => p.Parent.Identifier == t.Identifier)
              let lastPost = posts.OrderByDescending(p => p.When).FirstOrDefault()
              where t.Parent.Identifier == forum.Identifier
              orderby lastPost.When descending
              select t);

Не уверен, что попробовать дальше;кажется, что эти более продвинутые выражения LINQ избегают меня.Есть идеи?

1 Ответ

4 голосов
/ 22 августа 2011

Это должно работать:

var topics = from t in context.Topics
             where t.Parent.Identifier == forum.Identifier
             let lastPost = t.Posts.OrderByDescending(p => p.When).First()
             orderby lastPost.When descending
             select t;

(при условии, что Topic всегда имеет один или несколько Post)

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