Как спроецировать результат EF Linq на IEnumerable <IBook>, где Book явно реализует в IBook? - PullRequest
0 голосов
/ 12 августа 2011

Попытка спроецировать результат EF linq на IEnumerable из интерфейсов, что-то похожее на приведенное ниже, но не может заставить его работать, любые советы приветствуются:

                IEnumerable<IBook> books = (from b in context.Library
                                                  (select new (Book() as IBook)
                                                  {
                                                      Id = b.Id,
                                                      Title = b.Title
                                                  }).AsEnumerable<IBook>;

Ошибка: невозможно преобразовать лямбда-выражение в строку типа, поскольку это тип делегата.

PS: Это явная реализация интерфейса, поэтому я не могу просто использовать следующее, которое работает с неявной реализацией интерфейса:

                IEnumerable<IBooks> books = (from b in context.Library
                                                  select new Book()
                                                  {
                                                      Id = b.Id,
                                                      Title = b.Title
                                                  }).AsEnumerable<IBook>();

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Попробуйте:

IEnumerable<IBooks> books = (from b in context.Library
    select new Book
    {
        Id = b.Id,
        Title = b.Title
    }).Cast<IBook>();

Или вы можете сделать это:

IEnumerable<IBooks> books = (from b in context.Library
    select new Book
    {
        Id = b.Id,
        Title = b.Title
    } as IBook);

Третий вариант (для вашего явного интерфейса):

IEnumerable<IBook> books = context.Library.Select(b =>
{
    IBook book = new Book();  //as IBook - Might need a cast here 
    book.Id = b.Id;
    book.Title = b.Title;
    return book;
};
1 голос
/ 12 августа 2011

Я знаю, что это своего рода «ежу понятно», но убедитесь, что это пространство имен импортировано, потому что я видел эту ошибку, вызванную пропуском снова и снова.

using System.Linq;

Если я правильно помню, это будеткомпилировать, но будет выдавать эту ошибку во время выполнения, если это пространство имен не объявлено.

Также, если вы хотите очистить запрос LINQ (я люблю использовать лямбда-выражения), я считаю, что это выражение lamda будет работать для вашей ситуации.

IEnumerable<IBooks> books = (context.Library.Select(b => new Book{ b.Id, b.Title })).Cast<IBook>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...