2011-07-17 4 views
1

I 속성 "사용자"내가이있는 방법은 그가 주어진 "물론"계산하는 방법을 엔티티 제대로

 private static bool UserIsInTeamOfCourse(Course course, User user) 
     { 
      var count = course.Teams.Count(x => x.Users.Contains(user)); 
      if (count > 0) 
      { 
       return true; 
      } 

      return false; 
     } 

의 팀에 이미 있는지 확인하기 위해 노력하고있어해야하지만 그렇지 않습니다 작업. 내 사용자 모델에서 사용자 지정 Equals 메서드를 만들었지 만 여전히 작동하지 않습니다. [편집] 항상 0 개의 항목을 계산하지만 하나 이상의 항목이 있어야합니다. 많은 관계로 많은이 가정

public override bool Equals(object obj) 
    { 
     return UserId == ((User)obj).UserId; 

    } 
+0

정의 "가 작동하지 않습니다." 오류가 발생 했습니까? 항상 0을 반환합니까? 항상 모든 값을 반환합니까? – Tridus

+0

팀 중 하나에 사용자가 있지만 항상 0을 반환합니다. – Gesh

+0

요소를 계산하지 않으려면 Count를 사용해야하는 이유는 무엇입니까? 조언을 위해 [모두] (http://msdn.microsoft.com/en-us/library/bb534972.aspx) –

답변

1
bool isUserInAnyTeam = course.Teams.Any(t => t.Users.Any(u => u.Id == user.Id)); 

이것은 당신이 메모리에 Teams 컬렉션 쿼리 때문에 객체에 LINQ입니다 (아마도 int 형 또는 기타 단순 유형되는) 사용자 ID를 비교합니다. 따라서 Teams 컬렉션이 이미로드되었거나 지연로드 될 것으로 가정합니다.

EF 4.1에서

DbContext와 :

bool isUserInAnyTeam = dbContext.Entry(course).Collection(c => c.Teams).Query() 
           .Any(t => t.Users.Any(u => u.Id == user.Id)); 

또는 EF 4.0 :

bool isUserInAnyTeam = course.Teams.CreateSourceQuery()  
          .Any(t => t.Users.Any(u => u.Id == user.Id)); 
가로드되지 그리고 당신은 게으른 로딩을 사용하지 않는 경우에는 컬렉션 데이터베이스 쿼리를 만들 수 있습니다

Teams은 마지막 경우에 EntityCollection<Team>이어야합니다.

또 다른 방법은 처음부터 조회 할 수 있습니다 :

bool isUserInAnyTeamOfCourse = context.Courses.Any(
    c => c.Id == course.Id && c.Teams.Any(t => t.Users.Any(u => u.Id == user.Id))); 
+0

thx. 이제 작동합니다. 때때로 EF는 너무 혼란 스럽습니다. – Gesh

0

팀과 사용자를 betweens와 사용자가 같은 팀의 두 부분이 될 수 없습니다.

var count = (from c in context.Teams 
      from u in c.Users 
      where u.Id == 1 
      select c.Id).Count(); 

엔터티 프레임 워크는 사용자가 같음을 오버라이드 한 SQL 코드를 SQL 함수로 변환 할 수 없습니다. 대신에 비교하는 사용자 정의 객체의

+0

정말이에요? 나는'UserIsInTeamOfCourse'를 두 번 사용하기 때문에. 한 번은 컨트롤러에서 작업에 대한 액세스를 제한하고 한 번은보기에서 "참가"버튼을 표시하거나 숨길 수 있습니다. 컨트롤러로부터 메소드를 호출하면,'User' 클래스의'Equals' 메소드를 호출합니다. 뷰가 메서드를 호출하면 'Equals' 메서드에 액세스하지 않습니다. – Gesh

+0

LINQ to Entities (엔티티 프레임 워크라고도 함)와 LINQ to Objects의 차이점이 있습니다. – BennyM

0

private static bool UserIsInTeamOfCourse(Course course, User user) 
    { 
     return course.Teams.Where(team => team.Users.Any(u => u.userID == user.userID)).Count() > 0; 
    } 
관련 문제