LINQ to Entities находит лучшие записи из упорядоченных группировок - PullRequest
4 голосов
/ 05 июля 2011

У меня есть проблема, которую я знаю, как решить в SQL, но не с помощью Linq to Entities.

Мои данные выглядят так:

ID    GROUP   TIMESTAMP
--    -----   ---------
1     A       2011-06-20
2     A       2011-06-21
3     B       2011-06-21
4     B       2011-06-22
5     B       2011-06-23
6     C       2011-06-30

Я хочу получить всю сущностьобъекты (не только идентификатор), так что я получаю только самые последние записи из каждой группы.(т.е. записи с идентификаторами 2, 5, 6)

В SQL я бы сделал что-то вроде этого:

SELECT * FROM my_table a
WHERE a.timestamp = 
   (SELECT MAX(timestamp) FROM my_table b
   WHERE a.group = b.group)

(Ради этого вопроса вы можете предположить, что отметка времениуникальный в каждой группе).

Я хотел бы выполнить этот запрос к службе данных WCF с использованием Linq to Entities, но у меня не может быть вложенного запроса, который ссылается на внешний запрос, подобный этому.Кто-нибудь может помочь?

Ответы [ 4 ]

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

Возможно, не так чисто и эффективно, как рукописная версия, но вот что я придумал

    var q = from a in db.MyEntities
            where a.Timestamp == (from b in db.MyEntities
                                  where b.Group == a.Group
                                  select b.Timestamp).Max()
            select a;

, что переводится в этот SQL

SELECT
[Project1].[Id] AS [Id],
[Project1].[Group] AS [Group],
[Project1].[Timestamp] AS [Timestamp]
FROM ( SELECT
        [Extent1].[Id] AS [Id],
        [Extent1].[Group] AS [Group],
        [Extent1].[Timestamp] AS [Timestamp],
        [SSQTAB1].[A1] AS [C1]
        FROM [MyEntities] AS [Extent1]
         OUTER APPLY
        (SELECT
                MAX([Extent2].[Timestamp]) AS [A1]
                FROM [MyEntities] AS [Extent2]
                WHERE [Extent2].[Group] = [Extent1].[Group]) AS [SSQTAB1]
)  AS [Project1]
WHERE [Project1].[Timestamp] = [Project1].[C1]
1 голос
/ 05 июля 2011

Здравствуйте, попробуйте использовать linqer, который преобразует ваши операторы sql в запрос linq.

Linqer

С наилучшими пожеланиями

0 голосов
/ 05 июля 2011

Вот, пожалуйста. Простой способ сделать.

      var result = (from x in my_table
                      group x by x.Group into g
                      select new
                      {
                          g.Key,
                          timestamp = g.Max(x => x.TimeStamp),
                          g //This will return everything in g
                      });
0 голосов
/ 05 июля 2011

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

var query = db.my_table
   .GroupBy(p=>p.group)
   .Select(p=>p.OrderByDescending(q=>q.timestamp).First());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...