Альтернативный способ сделать FirstOrDefault в LINQ - PullRequest
1 голос
/ 01 февраля 2012

У меня есть таблица членства, в которой записывается, является ли пользователь членом списка.Когда происходит обновление членства пользователя, записывается новая запись, а предыдущие записи остаются как есть, что позволяет вести историю их членства.Чтобы получить статус участника, необходимо выбрать его самую последнюю запись.

Пример некоторых данных о членстве в списке пользователей приведен ниже.Цель состоит в том, чтобы найти выражение LINQ, которое группирует по списку и пользователю, но возвращает только строку с последней вставленной записью.

List Name, Username, Comment, ExpiresOn, Inserted
Test List, joeb, second update, 2012-03-13 16:55:03, 2012-01-31 22:28:40
Test List, joeb, first update, 2012-02-13 16:55:01, 2012-01-31 22:28:39
Test List, joeb, initial, 2012-01-13 16:55:02, 2012-01-31 22:28:38

Запрос SQL показывает, как можно извлечь текущий статус членства в списке.

select ulm2.ID, ulm2.ExpiresOn, ulm2.Comment, ulm2.Inserted 
from UserListMembership as ulm1
left outer join UserListMembership ulm2 on ulm1.id = ulm2.id
group by ulm1.userlistid, ulm1.userid;

Вопрос заключается в том, как написать выражение LINQ для запроса, который не использует вложенный вызов FirstOrDefault, который заставляет моего провайдера инфраструктуры сущностей MySQL выдавать «System.NotSupportedException: указанный метод не поддерживается».исключение?

Обновление:

Ниже мое ошибочное выражение LINQ выдает «Указанный метод не поддерживается» после добавления вызова FirstOrDefault.

var query = from mem in db.UserListMemberships
            where
              mem.User.UserUsernames.Any(y => y.Username.ToLower() == username.ToLower())
              && mem.UserList.Account.Subscriptions.Any(x => x.ID == subscriptionID)
              && mem.ExpiresOn > utcNow
            group mem by new { mem.UserListID, mem.UserID } into g
            select new { UserListMembership = (from mem2 in db.UserListMemberships where mem2.UserListID == g.Key.UserListID && mem2.UserID == g.Key.UserID orderby mem2.Inserted descending select mem2).FirstOrDefault() };

 return query.Select(a => a.UserListMembership).ToList();

1 Ответ

0 голосов
/ 01 февраля 2012

Без публикации кода кому-либо трудно понять, в чем заключается ваша проблема.

Не можете ли вы просто упорядочить результаты по полю даты и затем выбрать первую запись? Что-то вроде users.OrderByDescending(u => u.Inserted).FirstOrDefault()?

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