ElenaRez Ответов: 2

Invalidoperationexception: выражение LINQ для groupby


Я реализации основного проекта asp.net . Я написал запрос, как показано ниже в моем коде,
var RegisteredReqStatus = (from t1 in _context.Apiapplicant
    join t2 in _context.ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
    join t3 in _context.EntityType on t2.LastReqStatus equals t3.Id
    where t1.IsDeleted.Equals(false) && t1.LastRequestStatus == t2.Id
    group t2 by t2.LastReqStatus into ApiAppGp
        select new
        {
            lastReqName = ApiAppGp.FirstOrDefault().LastReqStatusNavigation.Name,
            ReqCount = ApiAppGp.Count()
        }
    ).ToList();


но после запуска моего проекта он показывает мне ошибку, как показано ниже:

InvalidOperationException: The LINQ expression '(GroupByShaperExpression: KeySelector: (a.lastReqStatus), ElementSelector:(EntityShaperExpression: EntityType: ApiApplicantHistory ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ) ) .FirstOrDefault()' не удалось перевести. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable(), AsAsyncEnumerable(), ToList () или ToListAsync(). Видишь ли https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Что я уже пробовал:

var RegisteredReqStatus = (from t1 in _context.Apiapplicant
    join t2 in _context.ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
    join t3 in _context.EntityType on t2.LastReqStatus equals t3.Id
    where t1.IsDeleted.Equals(false) && t1.LastRequestStatus == t2.Id
    group t2 by t2.LastReqStatus into ApiAppGp
        select new
        {
            lastReqName = ApiAppGp.FirstOrDefault().LastReqStatusNavigation.Name,
            ReqCount = ApiAppGp.Count()
        }
    ).ToList();

Garth J Lancaster

Мое "внутреннее чувство" заключается в том, что ApiAppGp - это анонимный тип, который, как следует из ошибки, не имеет AsEnumerable (), определенного на нем-следовательно,.FirstOrDefault() терпит неудачу.

Как следует из сообщения об ошибке, вы можете попробовать что-то еще

lastReqName = ApiAppGp.AsEnumerable().FirstOrDefault().LastReqStatusNavigation.Name,


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

ElenaRez

Спасибо за ваше предложение, тем не менее ошибка существует следующим образом:

.AsEnumerable()' не удалось перевести. Либо перепишите запрос в форме, которую можно перевести

2 Ответов

Рейтинг:
16

Richard Deeming

Группировка в EF Core 3.x действительно кажется довольно разборчивой в том, что она может и не может перевести.

Попробуйте сначала спроецировать значение свойства навигации:

var query = from t1 in _context.Apiapplicant
    join t2 in _context.ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
    join t3 in _context.EntityType on t2.LastReqStatus equals t3.Id
    where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id
    let tg = new 
    { 
        t2.LastReqStatus, 
        lastReqName = t2.LastReqStatusNavigation.Name 
    }
    group tg by tg.LastReqStatus into ApiAppGp
    select new
    {
        lastReqName = ApiAppGp.Max(x => x.lastReqName),
        ReqCount = ApiAppGp.Count()
    };

var RegisteredReqStatus = query.ToList();
Если он все еще не работает, возможно, вам придется вернуться к методу расширения:
var query = from t1 in _context.Apiapplicant
    join t2 in _context.ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
    join t3 in _context.EntityType on t2.LastReqStatus equals t3.Id
    where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id
    select new 
    { 
        t2.LastReqStatus, 
        lastReqName = t2.LastReqStatusNavigation.Name 
    };

var RegisteredReqStatus = query
    .GroupBy(tg => tg.LastReqStatus, (key, items) => new
    {
        lastReqName = items.Max(x => x.lastReqName),
        ReqCount = items.Count()
    })
    .ToList();


ElenaRez

Большое спасибо. Твое первое решение сработало для меня.

Рейтинг:
0

Maciej Los

Сообщение об ошибке совершенно ясно: FirstOrDefault()' could not be translated.
Я бы настоятельно рекомендовал прочитать это: EF Core: запросы LINQ больше не оцениваются на клиенте[^]
Чтобы решить эту проблему, попробуйте использовать агрегатную функцию, доступную в SQL:

///...
select new
{
       lastReqName = ApiAppGp.Max(x=>x.LastReqStatusNavigation.Name),
        ReqCount = ApiAppGp.Count()
}
//...


ElenaRez

тем не менее ошибка существует следующим образом:
.Max(x => x.LastReqStatusNavigation.Name)" не удалось перевести. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable(), AsAsyncEnumerable(), ToList () или ToListAsync(). Видишь ли https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Maciej Los

Вы должны знать, что у меня нет доступа к вашим данным, и я не могу видеть ваш экран. Таким образом, вы должны изменить свой запрос в соответствии с версией SQL.