2013-06-17 2 views
0

엔티티 프레임 워크 4.0을 사용하고 있습니다. 나는 두 테이블, 영화, 장르를 관계 N : N으로 갖는다. 데이터베이스에는 itermediate 테이블이 있지만 edmx를 만들 때 테이블은 두 개뿐입니다. 그것은 두 엔티티 생성됩니다 내 저장소에서엔티티 프레임 워크에서이 쿼리를 만드는 방법은 무엇입니까?

Movies 
{ 
    public Movies() 
    { 
     this.Genres= new HashSet<Genres>(); 
    } 

    public long IDMovie { get; set; } 
    public string Titulo { get; set; } 
    public virtual ICollection<Generos> Generos { get; set; } 
} 



Genres 
    { 
     public Genres() 
     { 
      this.Movies= new HashSet<Movies>(); 
     } 

     public long IDGenre { get; set; } 
     public string Genre{ get; set; } 
     public virtual ICollection<Movies> Movies{ get; set; } 
    } 

을, 나는 알 적어도 메서드의 매개 변수로 장르의 목록에 전달되는 generes 중 하나를 가지고 모든 영화를 반환하는 방법을 만들고 싶습니다 .

또한 매개 변수 목록에있는 개체가 개체 영화 컬렉션에있는 개체 장르와 다르기 때문에 직접 개체 장르가 아닌 IDGenre를 비교해야합니다.

나는이 수행하려고 :

myContext.Movies.Where(m=>(m.Genres.Select(gm=>gm.IDGenre).ToList<long>()).Intersect(listGenres.Genres.Select(gl=>gl.IDGenre).ToList<long>()).Any()); 

을하지만이 오류 얻을 : 엔티티에

LINQ는 방법 'System.Collections.Generic.List 1[System.Int64] ToList[Int64](System.Collections.Generic.IEnumerable 1 [System.Int64]을 인식하지 않습니다) '이며,이 메서드는 exp를 저장하는 것으로 변환 할 수 없습니다.

편집 : 두 경우 모두 ToList() 제거 시도했습니다. 나는이 코드를 사용합니다

myContext.Movies.Where(m=>(m.Genres.Select(gm=>gm.IDGenre)).Intersect(listGenres.Genres.Select(gl=>gl.IDGenre)).Any()); 

을 그리고이 경우이 오류가 얻을 : 그것은 형 장르의 상수 값을 만들 수 없습니다

합니다. 이 문맥에서는 오직 원시 타입 ('Int32, String y Guid'와 같은)만을 인정합니다.

감사합니다.

+1

'ToList'를 제거해 보셨습니까? – Romoku

+1

왜'.ToList ()'* 두 번 *? – Arran

+0

ToList()를 사용하지 않으면 다른 오류가 발생합니다. 나는 그것을 메인 포스트에 추가했다. –

답변

1

Any을 사용하는 경우 실제로 Intersect이 필요합니까? 열을 일치 시키려고하기 때문에 Join을 사용해보십시오.

var compareGenres = listGenres.Genres.Select(gl => gl.IdGenre).ToList(); 
var matchingMovies = myContext.Movies.Where(m => 
             m.Genres.Join(compareGenres, 
                 g => g.IdGenre, 
                 cg => cg.IdGenre, 
                 (g, cg) => g 
                ).Any()); 
관련 문제