如何将EF Linq结果投影到IEnumerable <ibook>,其中Book明确地在IBook中实现?</ibook>

时间:2011-08-12 02:16:05

标签: c# linq entity-framework

尝试将EF linq结果投影到IEnumerable接口中,类似于下面的内容,但无法使其正常工作,任何提示都是相关的:

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

错误:无法将Lambda表达式转换为字符串类型,因为它不是委托类型。

PS:它是显式接口实现,所以我不能只使用以下隐式接口实现:

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

2 个答案:

答案 0 :(得分:2)

试试这个:

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 :(得分:1)

我知道这有点'没脑子',但请确保导入此命名空间,因为我已经看到错误导致错误一遍又一遍。

using System.Linq;

如果我没记错的话,它会编译,但如果未声明该命名空间,则会在运行时抛出该错误。

此外,如果你想清理LINQ查询(我喜欢使用lambda),我相信这个lamda表达式适合你的情况。

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