Краткий ответ
Обычно достаточно сначала Select
нужного свойства, а затем FirstOrDefault
:
PracticeArea = am.Select(amItem => amItem.PracticeArea)
.FirstOrDefault(),
Location = am.Select(amItem => amItem.Location)
.FirstOrDefault(),
Publication = am.Select(amItem => amItem.Publication)
.FirstOrDefault(),
Объяснение ошибки
Вы должны знать разницу между IEnumerable<...>
и 'IQueryable <...> `.
IEnumerable предназначен для выполнения вашим собственным процессом. Он содержит все для выборки первого элемента, и как только вы его получите, вы можете получить следующий элемент, пока есть элементы.
На самом низком уровне это выполняется с помощью GetEnumerator()
. После того как у вас есть перечислитель, вы можете обращаться к элементам последовательности один за другим, многократно используя MoveNext()
и Current
.
На более высоком уровне это делается с помощью foreach
. Это также делается в каждом методе LINQ, который не возвращает IEnumerable<...>
. С другой стороны, IQueryable<...>
предназначен для обработки другим процессом, обычно системой управления базами данных. Он содержит Expression
и Provider
. Выражение представляет запрос в некотором общем формате c, провайдер знает, кто должен выполнить запрос и какой язык используется для связи с базой данных (обычно SQL).
Если вы внимательно посмотрите на LINQ, вы увидите, что есть две группы: те, которые возвращают IQueryable<...>
(или IEnumerable<...>
), и другие. Методы первой группы используют отложенное выполнение (иногда называемое ленивым исполнением). В каждом описании этого метода LINQ вы найдете этот термин.
Эти функции не будут взаимодействовать с базой данных, они изменят только выражение. Объединение этих функций не является дорогостоящей операцией.
Только когда вы начинаете перечисление, на низком уровне, используя GetEnumerator()
, или используя foreach
, или любой из методов LINQ второй группы, например ToList()
, `` Count () ,
Any () `, et c. Выражение отправляется Провайдеру, который попытается перевести его в SQL и выполнить запрос в базе данных.
Проблема в том, что Провайдер не знает, как перевести все методы в SQL. Например, он не знает ваших собственных методов. Кроме того, есть несколько методов LINQ, которые не поддерживаются. См. Список поддерживаемых и неподдерживаемых методов LINQ (LINQ to entity) .
Ваш провайдер не может перевести ваше использование First()
:
...First()' could not be translated.