GroupBy Expression не удалось перевести - PullRequest
1 голос
/ 07 января 2020
//Model
public class Application
{
    [Key]
    public int ApplicationId { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime ConfirmedDate { get; set; }
    public DateTime IssuedDate { get; set; }
    public int? AddedByUserId { get; set; }
    public virtual User AddedByUser { get; set; }
    public int? UpdatedByUserId { get; set; }
    public virtual User UpdatedByuser { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string TRN { get; set; }
    public string EmailAddress { get; set; }
    public string Address { get; set; }
    public int ParishId { get; set; }
    public Parish Parish { get; set; }
    public int? BranchIssuedId { get; set; }
    public BranchLocation BranchIssued { get; set; }
    public int? BranchReceivedId { get; set; }
    public BranchLocation BranchReceived {get; set; }
}

public async Task<List<Application>> GetApplicationsByNameAsync(string name)
{
    if (string.IsNullOrEmpty(name))
        return null;
    return await _context.Application
        .AsNoTracking()
        .Include(app => app.BranchIssued)
        .Include(app => app.BranchReceived)
        .Include(app => app.Parish)
        .Where(app => app.LastName.ToLower().Contains(name.ToLower()) || app.FirstName.ToLower()
        .Contains(name.ToLower()))
        .GroupBy(app => new { app.TRN, app })
        .Select(x => x.Key.app)
        .ToListAsync()
        .ConfigureAwait(false);
}

Приведенное выше выражение GroupBy не компилируется в VS Studio. Моя цель - запустить результаты фильтрации запросов по имени, содержащему заданную пользователем строку, а затем сгруппировать результаты по одинаковым TRN числам, возвращая список этих приложений для возврата к представлению. Я думаю, что я действительно близок, но просто не могу понять этот последний бит запроса. Любое руководство приветствуется.

Представляется ошибка

InvalidOperationException: The LINQ expression 'DbSet<Application>
.Where(a => a.LastName.ToLower().Contains(__ToLower_0) || a.FirstName.ToLower().Contains(__ToLower_0))
.GroupBy(
source: a => new {
TRN = a.TRN,
app = a
},
keySelector: a => a)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()

ОБНОВЛЕНИЕ Кажется, что это определенно связано с изменением в. net core 3.x и EF Ядро играть вместе, так как последние обновления. Мне пришлось изменить его на оценку клиента, используя AsEnumerable() вместо ToListAsync(). Остальная часть запроса, заданного Стивом Пи, работает с этим методом. Даже после прочтения документации я не знал, как сработала группа в LINQ, и это мне очень помогло. Однако при отправке запроса на клиентскую версию eval могут возникнуть проблемы с производительностью.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Исходя из этого:

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

Я считаю, что это должно удовлетворить то, что вы ищете:

return await _context.Application
    .AsNoTracking()
    .Include(app => app.BranchIssued)
    .Include(app => app.BranchReceived)
    .Include(app => app.Parish)
    .Where(app => app.LastName.ToLower().Contains(name.ToLower()) || app.FirstName.ToLower()
    .Contains(name.ToLower()))
    .GroupBy(app => app.TRN)
    .Select(x => x.OrderByDescending(y => y.CreatedAt).First())
    .ToListAsync()
    .ConfigureAwait(false);

Выражение GroupBy должно представлять то, что вы хотите группировать по. В твоем случае РНН. Оттуда, когда мы делаем выбор, x представляет каждую «группу», которая содержит Enumarable набор приложений, которые подпадают под каждый TRN. Таким образом, мы упорядочиваем их по убыванию даты CreatedAt, чтобы выбрать самую новую, используя First.

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

0 голосов
/ 14 января 2020

У меня похожая проблема, когда я нахожу это интересным и глупым одновременно. Похоже, команда EF запрещает делать WHERE перед GROUP BY, следовательно, это не работает. Я не понимаю, почему вы не можете сделать это, но, похоже, так оно и есть, что заставляет меня реализовывать процедуры вместо того, чтобы красиво создавать код.

LMK, если вы найдете способ.

Примечание: они группируются только тогда, когда вы сначала группируете, а затем делаете где (где для сгруппированных элементов полной таблицы => не имеет никакого смысла для меня)

...