Torakami Ответов: 1

Как я могу писать сложные группы с помощью запроса 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();

1 Ответов

Рейтинг:
1

Richard Deeming

Ядро EF GroupBy поддержка может быть немного шелушащейся. Попробуйте вместо этого запустить запрос с пользователями:

var skipperLocations = _appContext.Users
    .Select(u => u.Locations
        .Where(l => l.Timestamp > cutOffDate)
        .OrderByDescending(l => l.Timestamp)
        .FirstOrDefault())
    .ToList();


Torakami

Не уверен, что это сработает, глядя на то, какой запрос я пытаюсь построить, позвольте мне проверить.

Maciej Los

5ed!