Альтернатива для ElementAtOrDefault - PullRequest
2 голосов
/ 01 апреля 2020

Логотип моего бизнеса c следующий. У меня есть CustomerEvents таблица. Таблица содержит столбец CreatedAt и столбец CustomerId. Мне нужно получить последнее и предыдущее событие для конкретного клиента. С последним у меня проблем нет. Но что делать с предыдущим? Я пытался ElementAtOrDefault. Но это не работает. Я покажу вам мой код:

PrevReDepDate = context.CustomerEvents.Where(y
        => y.Customer.CustomerId == 123 && y.EventType == "deposit" && y.Again == true)
    .Select(y => y.CreatedAt).OrderByDescending(y => y)
    .ElementAtOrDefault(1),

Не работает. Мне кажется, это происходит потому, что EF не может выполнить его на стороне сервера базы данных. Вот текст исключения:

System.InvalidOperationException: Обработка выражения LINQ 'DbSet .ElementAtOrDefault (__ p_0)' с помощью NavigationExpandingExpressionVisitor 'завершилась неудачно. Это может указывать либо на ошибку, либо на ограничение в EF Core. См. https://go.microsoft.com/fwlink/?linkid=2101433 для получения более подробной информации. в Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall (MethodCallExpression methodCallExpression)

Я прав? Если да, любые альтернативы для получения предыдущего элемента, как с помощью ElementAtOrDefault?

1 Ответ

2 голосов
/ 01 апреля 2020

Вы правы, как вы уже догадались, метод ElementAtOrDefault невозможно перевести на T- SQL, Linq to Entities не смог его распознать. Вы можете использовать методы Skip и Take, что-то вроде этого:

.Select(y => y.CreatedAt).OrderByDescending(y => y).Skip(1).Take(1)

В качестве другой альтернативы вы можете использовать .ToList() или AsEnumerable методы также как этот ответ { ссылка }, но вы должны знать, используя их после загрузки данных, любая дальнейшая операция выполняется с использованием Linq to Objects над данными, уже находящимися в памяти. Так что, если вам не безразлична производительность, я не уверен, что такой подход будет хорошим выбором в вашем случае.

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