Не может быть выведено из использования.Попробуйте явно указать аргументы типа - PullRequest
0 голосов
/ 27 августа 2018

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

 var jobDegreesQuery = _context.JOBDEGREEs.AsQueryable().Select(d=> new {d.DEGREE_CODE,d.DEGREE_NAME });

            if (!String.IsNullOrWhiteSpace(name))
                jobDegreesQuery = jobDegreesQuery.Where(c => c.DEGREE_NAME.Contains(name));

            var jobDegreeDTOs = jobDegreesQuery
               .ToList()
               .Select(Mapper.Map<JOBDEGREE, JobDegreeDTO>); //The error

Аргументы типа для метода 'Enumerable.Select (IEnumerable, Func)' не могут быть вывод из использования. Попробуйте указать аргументы типа явно.

Как я могу сделать проекцию и отобразить на DTO Успешно?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Каков результат вашего ToList()? Это список объектов некоторого анонимного класса, который содержит данные, извлеченные из вашей последовательности JobDegrees

Всякий раз, когда вы хотите использовать Enumerable.Select для последовательности объектов, вам сначала нужно назвать идентификатор, представляющий один элемент вашей последовательности. Этот идентификатор является частью перед =>. После => вы напишите код для возврата одного объекта, используя этот входной идентификатор.

Это сложный способ сказать что-то вроде:

IEnumerable<Person> myPersons = ...
var firstNames = myPersns.Select(person => person.FirstName);

Здесь person перед => представляет один элемент вашей коллекции Persons. Следовательно, person кажется правильным именем для этого идентификатора.

Если вы хотите, вы можете использовать любой идентификатор для идентификации person, хотя не все идентификаторы улучшат читабельность:

var firstNames = myPersns.Select(x => x.FirstName);

При использовании LINQ и платформы сущностей рекомендуется идентифицировать коллекции с существительными во множественном числе и элементы коллекций с существительными в единственном числе.

После => вы пишете некоторый код, который использует этот ввод person, чтобы вернуть ровно один объект. В этом примере FirstName из person.

Вернуться к вашему вопросу

Результатом вашего ToList является последовательность объектов с DegreeCode и DegreeName.

Если вы хотите преобразовать каждый объект в вашей последовательности в один другой объект (это называется проекцией), вам придется идентифицировать один объект в вашей последовательности перед '=>'.

Например

...ToList()
.Select(extractedDegreeData => ...)

Здесь каждый extractedDegreeData соответствует одному элементу вашего списка.

Теперь, что вы хотите сделать с одним таким extractedDegreeData? Вы хотите вернуть возвращаемое значение Mapper.Map<JOBDEGREE, JobDegreeDTO>(extractedDegreeData).

Поэтому ваш код должен выглядеть так:

...ToList()
.Select(extractedDegreeData => Mapper.Map<JOBDEGREE, JobDegreeDTO>(extractedDegreeData));

Совет:

При создании запроса LINQ не используйте такие функции, как ToList, или любые другие функции, которые не возвращают IEnumerable<TResult>, это пустая трата вычислительной мощности. Что если после вашего Select вы бы поставили Take(2)? Какая трата, чтобы создать полный список из 1000 элементов, если вы хотите только первые два!

Поэтому такие функции, как ToList, FirstOrDefault, Max, Count всегда должны быть последними в вашем запросе linq.

Наконец: dbContext.JobDegrees - это DbSet<JobDegree>, который реализует IQueryable<JobDegree>, следовательно, нет необходимости использовать AsQueryable.

0 голосов
/ 27 августа 2018

Как я понимаю, вы хотите сопоставить JOBDEGREEs с JobDegreeDTO. Сначала вы выбираете его как анонимный тип, поэтому я думаю, что AutoMapper не может отобразить, потому что вы даете anon. типа.

Измените свой код, как показано ниже, он будет работать лучше:

IQueryable<JOBDEGREEs> jobDegreesQuery = _context.JOBDEGREEs; // it is already queryable

if (!String.IsNullOrWhiteSpace(name))
    jobDegreesQuery = jobDegreesQuery.Where(c => c.DEGREE_NAME.Contains(name));

var jobDegreeDTOs = jobDegreesQuery
   //.Select(d=> new {d.DEGREE_CODE,d.DEGREE_NAME }) // do you need this?
   .Select(d => Mapper.Map<JOBDEGREE, JobDegreeDTO>(d)); // here you can give any expression
   .ToList()
...