Как я могу писать сложные группы с помощью запроса LINQ в сети многоточия ядро 3.1 ?
Проблема в том, что в группе by я хочу получить первый результат в группе с помощью first() или firstOrDefault (), но я получаю сообщение об ошибке
Цитата:невозможно было перевести. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable(), AsAsyncEnumerable(), ToList () или ToListAsync().
Теперь, если я использую IEnumerable .. Я беру все записи, которые мне не нужны, а затем применяю группу, которая влияет на мою производительность.
Вместо first (), если я использую min() или max() запрос действительно работал, но это недопустимая запись, которую я получаю.
Все , что мне нужно, это в группе by I want first() записи для каждой строки.
Что я уже пробовал:
Старый запрос
var cutOffDate = DateTime.UtcNow.AddMinutes(-cutOffMinutes); var skipperLocations = GetUserLocations().AsEnumerable() .Where(l => l.Timestamp > cutOffDate) .OrderByDescending(l => l.Timestamp) .GroupBy(l => l.UserId) .Select(l => new UserLocation { UserId = l.Key, Latitude = l.First().Latitude, Longitude = l.First().Longitude, Speed = l.First().Speed, Timestamp = l.First().Timestamp }).ToList(); return skipperLocations.Join(_appContext.Users, o => o.UserId, i => i.Id, (o, i) => new SkipperLocation { UserId = o.UserId, Latitude = o.Latitude, Longitude = o.Longitude, Speed = o.Speed, Timestamp = o.Timestamp, Name = i.FriendlyName, BoatNumber = i.BoatNumber });
Новый запрос, который работает, но не получает правильных записей из-за мин()
var cutOffDate = DateTime.UtcNow.AddMinutes(-cutOffMinutes); return (from cust in _appContext.UserLocations join u in _appContext.Users on cust.UserId equals u.Id where cust.Timestamp > cutOffDate group new { cust, u } by new { cust.UserId, u.FirstName, u.LastName, u.BoatNumber } into g select new SkipperLocation { UserId = g.Key.UserId, Latitude = g.Min(x => x.cust.Latitude), Longitude = g.Min(x => x.cust.Longitude), Speed = g.Min(x => x.cust.Speed), Timestamp = g.Max(x => x.cust.Timestamp), Name = g.Key.FirstName + " " + g.Key.LastName, BoatNumber = g.Key.BoatNumber }).OrderByDescending(c => c.Timestamp).AsNoTracking().ToList();