Re[3]: Как получить последнюю/первую запись в группировке?
От: ShurikEv  
Дата: 20.02.15 09:44
Оценка:
Здравствуйте, ShurikEv, Вы писали:

SE>Здравствуйте, ShurikEv, Вы писали:


SE>>Здравствуйте, ShurikEv, Вы писали:


SE>>>BLToolkit

SE>>>Собственно сабж.

SE>>>Надо, чтобы работало вот это https://smehrozalam.wordpress.com/2009/12/29/linq-how-to-get-the-latest-last-record-with-a-group-by-clause/


SE>>>Пытаюсь выполнить код

SE>>>
SE>>>from p in PersonOrders
SE>>>//where conditions or joins with other tables to be included here
SE>>>group p by p.PersonID into grp
SE>>>select grp.OrderByDescending(g=>g.OrderDate).First()
SE>>>

SE>>>Приложение падает. Реально ли сделать то, что хочу? Или проще plain text sql писать?

SE>>Точнее падает (без кидания exception) только во втором случае. В первом же ловлю исключение:

SE>>Additional information: 'Key' is not a member of type '<>f__AnonymousType0`2[System.Linq.IGrouping`2[System.String,DataModels.customer],System.Int32]'

SE>>Попробовал linq2db, тоже самое

SE>Проверил в EF, всё работает. Блин, почему BLT не может?
SE>Похоже придётся текстом набирать запрос

Выкрутился
var tbl = customersDb.Customer
                    .GroupBy(c => c.PassportNumber)
                    .Select(groups => new {groups.Key, MaxId = groups.Max(g => g.Id)});

                var res = from c in customersDb.Customer
                    from t in tbl
                    where c.Id == t.MaxId
                    select new {c.FirstName, c.LastName, c.PassportNumber};

                var result = res.ToList();

Правда генерируется аж 3 селекта вместо 2х
SELECT
    [t4].[FirstName] as [FirstName1],
    [t4].[LastName] as [LastName1],
    [t4].[PassportNumber] as [PassportNumber1]
FROM
    (
        SELECT
            [t1].[customer_id] as [Id],
            [t3].[c1] as [c11],
            [t1].[customer_first_name] as [FirstName],
            [t1].[customer_last_name] as [LastName],
            [t1].[customer_passport_number] as [PassportNumber]
        FROM
            [customers] [t1],
            (
                SELECT
                    Max([t2].[customer_id]) as [c1]
                FROM
                    [customers] [t2]
                GROUP BY
                    [t2].[customer_passport_number]
            ) [t3]
    ) [t4]
WHERE
    [t4].[Id] = [t4].[c11]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.