Как проецировать запрос LINQ-to-SQL в пользовательский объект с помощью GroupBy и OrderBy - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь преобразовать этот запрос, чтобы он выводил в объект пользовательского типа DTO.Я хочу получить только страницы с наибольшим номером ревизии для int[], который я передаю.

return from page in db.Pages
               where intItemIdArray.Contains(page.pageId)
               group page by page.pageId into g
               orderby g.Max(x => x.pageId)
               select g.OrderByDescending(t => t.revision).First();

Но когда я пытаюсь заменить

select g.OrderByDescending(t => t.revision).First();

чем-то вроде

select (new JPage {pageid = g.pageId, title = g.title, etc})
    .OrderByDescending(t => t.revision)
    .First();

Это не работает, кто-нибудь может мне помочь?


Это то, чем я занимался в настоящее время, что мне не нравится, но работает отлично,и мне не нужно оптимизировать дальше этого.

Было бы здорово, если бы кто-то мог улучшить это.

var pages = from page in db.Pages
               where intItemIdArray.Contains(page.pageId)
               group page by page.pageId into g
               orderby g.Max(x => x.pageId)
               select g.OrderByDescending(t => t.revision).First();

        return pages.Select(x => new JPage() { 
            pageId = x.pageId,
            pageKey = x.pageKey,
            title = x.title,
            body = x.body,
            isFolder = x.isFolder.ToString(),
            leftNode = x.leftNode,
            rightNode = x.rightNode,
            revision = x.revision,
            sort = x.sort,
            createdBy = x.createdBy.ToString(),
            createdDate = Utility.DateTimeToUnixTimeStamp(x.createdDate).ToString(),
            modifiedDate = Utility.DateTimeToUnixTimeStamp(x.modifiedDate).ToString(),
            pageVariationId = x.pagesVariationId,
            parentId = x.parentId
        })
        .AsQueryable(); 

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Я бы посоветовал вам заказать до , который вы выберете;то есть вместо

select (new JPage {pageid = g.pageId, title = g.title, etc}
    .OrderByDescending(t => t.revision).First();

вы должны попробовать

.OrderByDescending(t => t.revision)
    .Select(new JPage {pageid = g.pageId, title = g.title, etc})
    .First();

Вы не можете упорядочить по 'пересмотру', если он не существует в результате предыдущего 'выбора'

0 голосов
/ 14 сентября 2011

Это должно быть небольшое улучшение

var pages = from page in db.Pages
               where intItemIdArray.Contains(page.pageId)
               group page by page.pageId into g
               select g.First(a => a.revision == g.Max(b => b.revision));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...