2015-12-16 5 views
0

У меня есть следующий код в модульном тесте. Но он возвращает ошибку, указанную при запуске.Невозможно лить объект типа 'System.Collections.Generic.List`1 []' для ввода 'System.Linq.IQueryable`1 []'

var leaveTypesList = new List<LeaveType>() { leaveType1, leaveType2, leaveType3 }; 
var leaveTypesQueryable = leaveTypesList.AsQueryable(); 
mockLeaveTypeRepository.Setup(r => r.GetLeaveTypes()).Returns(leaveTypesQueryable); 
var leaveTypeDtos = service.GetLeaveTypes(); 

Ошибка получена из последней строки, когда результаты возвращаются из службы.

Код услуги для перечисленного ниже метода GetLeaveTypes, который представляет собой простой доступ к репозиторию.

public IQueryable<LeaveTypeDto> GetLeaveTypes() 
    { 
     //return Mapper.Map<IQueryable<LeaveTypeDto>>(leaveTypeRepository.GetLeaveTypes()); 
     return leaveTypeRepository.GetLeaveTypes().ProjectTo<LeaveTypeDto>(); 
    } 

код Репозиторий также простое возвращение к IQueryable видов отпусков.

public IQueryable<LeaveType> GetLeaveTypes() 
    { 
     return dbContext.LeaveType.Where(lt => lt.IsActive); 
    } 

Просто не могу понять, что здесь не так. Есть идеи?

+1

Вы проверили, что 'leaveTypeRepository.GetLeaveTypes()' фактически возвращает 'IQueryable '? –

+0

Какой тип возвращаемого значения 'leaveTypeRepository.GetLeaveTypes()'? –

+1

Замените ключевое слово var на типы, поскольку они неясны для читателя. – Kaido

ответ

1

Вы хотите нанести leaveTypeRepository.GetLeaveTypes() на IQueryable соответствующего объекта DTO. Я предполагаю, что вы хотите этого, потому что leaveTypeRepository.GetLeaveTypes() тоже является IQueryable, и вы хотите оставаться на связи со своим поставщиком запросов.

AutoMapper имеет different method для этого:

using AutoMapper.QueryableExtensions; 

... 

return leaveTypeRepository.GetLeaveTypes() 
      .ProjectTo<LeaveTypeDto>(); 

Это возвращает IQueryable<LeaveTypeDto>, к которому можно применить последующие методы LINQ, которые все еще будут переведены на SQL.

И теперь причина исключения. Это связано с тем, что для IQueryable<T> нет реализации по умолчанию. AutoMapper создает List<LeaveTypeDto>, но это невозможно изначально преобразовать в IQueryable<LeaveTypeDto>. Однако вы можете сделать что-то вроде ...

Mapper.Map<IEnumerable<LeaveTypeDto>>(source) 
Mapper.Map<IList<LeaveTypeDto>>(source) 
Mapper.Map<LeaveTypeDto[]>(source) 

... потому что для этих целевых видов AutoMapper знает, какие по умолчанию реализация должна использовать (List<T> или T[]).

+0

Спасибо за быстрое обновление. Но проблема все еще сохраняется. Я думаю, проблема связана с третьей строкой первого набора кода, где я устанавливаю 'mockLeaveTypeRepository' для возврата' IQueryable', но все же возвращает IList. Я добавил как метод службы, так и методы репозитория для вашей ссылки, и оба они возвращают 'IQueryable'. –

+0

Должно быть хорошо. Он настроен на возврат 'leaveTypesList.AsQueryable()', который является подлинным 'IQueryable'. 'AsQueryable()' фактически [* преобразует * список в реализацию 'IQueryable'] (http://stackoverflow.com/a/17996264/861716). Из того, что я вижу, я не понимаю, почему вы все еще получаете ошибку. –

+0

Плохо, я сделал что-то не так. Но теперь он работает после использования QuerableExtensions и ProjectTo, а не прямой карты. Спасибо за помощь. –

Смежные вопросы