2011-08-12 2 views
0

하지만이 작동되지 수있는 힌트는 apreciated된다EF Linq 결과를 IEnumerable에 투영하는 방법 <IBook> Book이 명시 적으로 IBook에서 구현하는 항목은 무엇입니까? 아래에, simialr 뭔가를 인터페이스는 IEnumerable로 EF의 LINQ 결과를 프로젝트에 노력

   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

을이 :

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); 

제 3의 옵션 (명시 적 인터페이스 용) :

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 속성이 명시 적으로 구현되었지만 컴파일러는 ID가없는 책 또는 제목이 정의되지 않은 것에 대해 불평했습니다. 인터페이스를 암시 적으로 구현했습니다. 명시 적으로 – Arjang

+0

위의 편집을 참조하십시오. 실용적인 명시 적 인터페이스가 얼마나 확실하지 않습니다. 나는 그들로부터 멀리 떨어져 경향이있다. 왜냐하면'new Book {Id = b.Id} '와 같은 멋진 객체 이니셜 라이저를 사용할 수 없기 때문이다. – jonathanpeppers

1

나는 이것이 일종의 '생각할 줄 모른다'는 것을 알고 있지만이 네임 스페이스는 가져 오기가 반복되어 누락 된 오류로 인해 가져 왔는지 확인합니다.

using System.Linq; 

정확하게 기억한다면 컴파일 할 것이지만 네임 스페이스가 선언되지 않으면 런타임에 오류가 발생합니다.

또한 LINQ 쿼리를 정리하려면 (lambda 's를 사용하는 것을 좋아합니다)이 lamda 표현이 자신의 상황에 맞을 것이라고 생각합니다.

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

아담 당신은 정확합니다, 이미 그것을 이미 이번에는 excpet. 하지만 당신이 thx에 대해 논평 한 후에 확인해야했습니다. – Arjang

관련 문제