Как я могу заказать в Linq Select Distinct, если он заказан включенным объектом? - PullRequest
0 голосов
/ 12 ноября 2018

Я знаю, что в Linq мне нужно сделать OrderBy после выполнения Select - Distinct, но я пытаюсь упорядочить по свойству сущности Included, которое теряется после Select.

Например:

var accounts = _context.AccountUser
                       .Include(o => o.Account)
                       .Where(o => o.UserId == userId || o.Account.OwnerId == userId)
                       .OrderByDescending(o => o.LastAccessed)
                       .Select(o => o.Account)
                       .Distinct();

Поскольку я делаю Where с помощью or двух разных параметров, есть хороший шанс получить дублированные результаты. Вот почему я использую Distinct.

Проблема в том, что после выполнения Select у меня больше нет свойства LastAccessed, поскольку оно не принадлежит выбранному объекту.

Я думаю, что структура AccountUser и Account может быть выведена из самого запроса.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Поскольку LINQ не реализует DistinctBy, а LINQ to SQL не реализует Distinct, который принимает IEqualityComparer, вы должны заменить GroupBy + Select вместо:

var accounts = _context.AccountUser
                       .Include(o => o.Account)
                       .Where(o => o.UserId == userId || o.Account.OwnerId == userId)
                       .GroupBy(o => o.Account).Select(og => og.First())
                       .OrderByDescending(o => o.LastAccessed)
                       .Select(o => o.Account);
0 голосов
/ 13 ноября 2018

Если у вас настроены свойства двунаправленной навигации:

var accountsQuery = _context.AccountUser
  .Where(o => o.UserId == userId || o.Account.OwnerId == userId)
  .Select(o => o.Account)
  .Distinct()
  .OrderByDescending(a => a.AccountUser.LastAccessed);

При выборе Учетной записи вам не нужно .Include() Имейте в виду, что любые связанные объекты, к которым вы получаете доступ из Учетной записи, будут загружаться с отложенной загрузкой. Я рекомендую использовать .Select() для извлечения либо плоской модели представления, либо иерархии модели представления, чтобы SQL загружал все необходимые поля, а не либо загружал все целиком, либо отключал вызовы отложенной загрузки.

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