I haven't had this issue before today. I created a new service. Very basic one. It returns a PagedResultDto. It works just fine when not using a search parameter. But as soon as I add a search parameter I get the below error.
My input looks like this. Any help would be greatly appreciated.
public class GetEmployeePagedInput : PagedAndSortedInputDto, IShouldNormalize
{
[StringLength(120)]
public string Filter { get; set; }
public void Normalize()
{
if (string.IsNullOrEmpty(Sorting))
{
Sorting = "FirstName";
}
}
}
ERROR 2017-12-05 18:09:40,996 [23 ] Mvc.ExceptionHandling.AbpExceptionFilter - Object reference not set to an instance of an object.
System.NullReferenceException: Object reference not set to an instance of an object.
at lambda_method(Closure , ValueBuffer )
at System.Linq.AsyncEnumerable.WhereEnumerableAsyncIterator1.<MoveNextCore>d__8.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Linq.AsyncEnumerable.AsyncIterator
1.<MoveNext>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Linq.AsyncEnumerable.TakeAsyncIterator1.<MoveNextCore>d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Linq.AsyncEnumerable.AsyncIterator
1.<MoveNext>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator2.<MoveNextCore>d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Linq.AsyncEnumerable.AsyncIterator
1.<MoveNext>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.<MoveNext>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Linq.AsyncEnumerable.<Aggregate_>d__6
3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at PHS.EmployeeDirectory.EmployeeDirectoryService.
6 Answer(s)
-
0
Can you show the implementation of EmployeeDirectoryService.<OpenEmployeeDirectory>?
-
0
Sure. Its two methods. One for the actual service and the other to create the query.
public async Task<PagedResultDto<EmployeeListDto>> OpenEmployeeDirectory(GetEmployeePagedInput input) { var query = CreateEmployeeDirectoryQuery(input); var employeeList = await query .OrderBy(input.Sorting) .PageBy(input) .ToListAsync(); var employeeCount = await query.CountAsync(); return new PagedResultDto<EmployeeListDto> (employeeCount, ObjectMapper.Map<List<EmployeeListDto>>(employeeList)); } private IQueryable<Employee> CreateEmployeeDirectoryQuery(GetEmployeePagedInput input) { var query = _employeeRepository.GetAll() .Select(e => new Employee { Id = e.Id, ProId = e.ProId, FirstName = e.FirstName, LastName = e.LastName, WorkPhone = e.WorkPhone, WorkExtension = e.WorkExtension, EmployeeEmail = e.EmployeeEmail, Department = e.Department, Division = e.Division, SupervisorName = e.SupervisorName }); query = query .WhereIf(!input.Filter.IsNullOrWhiteSpace(), pc => pc.FirstName.Contains(input.Filter) || pc.LastName.Contains(input.Filter) || pc.EmployeeStatus.Contains(input.Filter) || pc.EmployeeEmail.Contains(input.Filter)); return query; }
-
0
Could the FirstName, LastName, EmployeeStatus or EmployeeEmail be null?
-
0
Yes. None of them are required.
-
0
Then you need to add null-checks before using Contains.
-
0
Oh yes I should have thought of that. Thanks for the help.