Интерфейс IQueryable<AuthorBooks>
отличается от List<AuthorBooks>
. Первая проблема заключается в том, что ваш метод возвращает тип AuthorBooks[]
, который также отличается от желаемого типа возврата List<AuthorBooks>
.
Если вы sh метод GetAuthorsAndBooks()
вернете List<AuthorBooks>
, сначала соответствующим образом измените его тип возврата.
Затем в коде ваш оператор return
в настоящее время возвращает переменная authorsAndBooks
. Назначение этой переменной происходит через запрос LINQ, который приводит к типу IQueryable<AuthorBooks>
. Интерфейс IQueryable<T>
реализует интерфейс IEnumerable<T>
. Эти интерфейсы предназначены для преобразования практически любого IQueryable<T>
или IEnumerable<T>
во многие другие типы коллекций. Одним из таких методов является преобразование в List<T>
. И это доступно через метод ToList()
. (Обратите внимание, что если по какой-то причине вы по-прежнему хотите сохранить существующий тип возврата как AuthorBooks[]
, вы можете преобразовать в массив вместо List, используя метод ToArray()
вместо ToList()
.)
Обратите внимание, что вам нужно импортировать System.Linq
в свой код, чтобы иметь возможность использовать эти методы, если вы еще этого не сделали.
Определение IQueryable<T>
(см., Что он реализует IEnumerable<T>
:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.iqueryable-1?view=netframework-4.8#definition
Определение метода ToList()
доступно в IEnumerable<T>
:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.tolist?view=netframework-4.8
ПРИМЕЧАНИЕ. Технически интерфейс IEnumerable<T>
сам по себе не реализует метод ToList()
и даже не является частью реального интерфейса. Вместо этого он фактически определен для класса c класса Enumerable
используя "методы расширения".
ПРИЛОЖЕНИЕ: Для дополнительного удовольствия вы можете посмотреть исходный код самого метода ToList()
в. NET Framework здесь:
https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs