LINQ 2 SQL: топ 1 пост на члена, упорядоченный по созданным данным - PullRequest
1 голос
/ 18 сентября 2009

Хорошо, у меня есть sql для решения этой проблемы, как задано в вопросе stackoverflow здесь .

Кто-нибудь знает, как перевести это на linq 2 sql? Я предполагаю, что самый простой способ - добавить хранимую процедуру, но мне любопытно посмотреть, может ли она быть linq-a-fied: P

select p.* 
from post p join
(
    select memberId, max(createdDate) as maxd 
    from post 
    group by memberId

) as p2 on p.memberid = p2.memberid and p.createdDate=p2.maxd
order by p.createdDate desc

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Я не совсем уверен, что это самый эффективный способ выполнить этот запрос (возможно, это так, но у меня есть ощущение, что есть лучший способ. Еще не подумал).

from
    post in Nt_Post
join
    memberdates in (
        from
                p_inner in Nt_Post
        group
                p_inner by p_inner.MemberId into grouped 
        select new {
                MemberId = grouped.Key,
                ActivationDate = grouped.Max(m => m.ActivationDate)
        })
on
    new { post.MemberId, post.ActivationDate }
    equals
    new { memberdates.MemberId, memberdates.ActivationDate }
orderby post.ActivationDate
select post;
0 голосов
/ 18 сентября 2009

Вот запрос, работающий в пределах LinqPad в моей базе данных (не созданDate - это на самом деле ActivationDate, а таблица Post - Nt_Post. Спасибо Rex M за участие в решении: P

var q =
from
    post in Nt_Post
join
    memberdates in (
        from
            p_inner in Nt_Post
        group
            p_inner by p_inner.MemberId into grouped 
        select new {
            MemberId = grouped.Key,
            ActivationDate = grouped.Max(m => m.ActivationDate)
        })
on
    new { post.MemberId, post.ActivationDate }
    equals
    new { memberdates.MemberId, memberdates.ActivationDate }
orderby post.ActivationDate
select post;


q.Dump();

Сгенерированный sql:

SELECT [t0].[Id], [t0].[Title], [t0].[Teaser], [t0].[Text], [t0].[ActivationDate], [t0].[CreatedDate], [t0].[LastModifiedDate], [t0].[IsActive], [t0].[Permalink], [t0].[MemberId], [t0].[HomePageVisibility], [t0].[Image], [t0].[ImageContentType], [t0].[HasNotifiedRTR]
FROM [nt_Post] AS [t0]
INNER JOIN (
    SELECT MAX([t1].[ActivationDate]) AS [value], [t1].[MemberId]
    FROM [nt_Post] AS [t1]
    GROUP BY [t1].[MemberId]
    ) AS [t2] ON ([t0].[MemberId] = [t2].[MemberId]) AND ([t0].[ActivationDate] = [t2].[value])
ORDER BY [t0].[ActivationDate]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...