У меня очень странная проблема. Я заметил, что эта проблема возникает только при применении фильтра. (проверьте комментарии в коде для получения дополнительной информации)
Трассировка стека:
Код:
if (!string.IsNullOrEmpty(searchTerm)) // If that pass only then i got exception!
{
query = query.Where(FilterBySearchTerm2(searchTerm));
}
var count = await query.CountAsync(); // here is the exception
var totalPages = (int)Math.Ceiling(count / (double)Pagination.DefaultPageSize);
- метод фильтрации
private Expression<Func<User, bool>> FilterBySearchTerm(string searchTerm)
{
return u => u.FirstName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.MiddleName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.LastName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.FullName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase) // FullName is NotMapped property in the User class!
|| u.Company.Name.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.Email.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.Address.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.IncorporationNumber.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.DirectorFullName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.DirectorEmail.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.DirectorPhone.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Phone.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Email.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
|| u.Company.CompanyPrograms.Any(cp => cp.Program.Name.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase));
}
- Свойство FullName в классе пользователя
[NotMapped]
public string FullName => string.IsNullOrEmpty(this.MiddleName) ?
$"{this.LastName} {this.FirstName}" :
$"{this.LastName} {this.FirstName} {this.MiddleName}";
Кажется, это очень глубоко в ядре платформы сущностей, но я не знаю, является ли это ошибкой или ожидается, что она будет работать именно так.
UPDATE
Я проверил с более простым выражением, и я нашел следующее:
Не работает:
return u => u.FirstName.Contains(searchTerm, StringComparison.InvariantCultureIgnoreCase)
Работа:
return u => u.FirstName.Contains(searchTerm)
Работа:
return u => u.FullName.Contains(searchTerm)
Не работает:
return u => u.FirstName.Contains(searchTerm)
|| u => u.MiddleName.Contains(searchTerm)
|| u => u.LastName.Contains(searchTerm)
|| u => u.FullName.Contains(searchTerm)