2011-08-12 46 views
0

嘗試投射EF LINQ結果到接口IEnumerable的,東西simialr以下,但不能得到它的工作,任何提示是apreciated:如何將EF Linq結果投影到IEnumerable <IBook>其中Book在IBook中明確實現?

   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

試試這個:

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; 
}; 
+0

謝謝,但是屬性Id和Title明確實現,編譯器抱怨Book沒有Id或Title定義。我已經實現了接口隱含和明確 – Arjang

+0

看到我上面的編輯。我不確定顯式接口是多麼實用。我傾向於遠離它們,因爲它阻止你使用諸如'new Book {Id = b.Id}'這樣的漂亮對象初始化器。 – jonathanpeppers

1

我知道這是一個'沒有腦子',但要確保這個命名空間是導入的,因爲我已經看到由於錯過一遍又一遍而導致的錯誤。

using System.Linq; 

如果我沒有記錯的話,它會編譯,但如果該名稱空間沒有聲明,將在運行時拋出該錯誤。

另外,如果你想清理LINQ查詢(我喜歡使用lambda的),我相信這個lamda表達式可以適用於你的情況。

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

亞當你是對的,這次它已經在那裏了。但是在你評論thx後,我必須檢查它 – Arjang