2011-07-17 83 views
1

我有有一個屬性「用戶」和我的方法我試圖檢查他已經在一隊給定的「課程」如何計算實體正確

 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方法,但它仍然不起作用。 [編輯]它總是計數零條目,但必須至少有一個條目。

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

    } 
+0

定義 「不工作」。拋出錯誤?總是返回零?總是返回所有的值? – Tridus

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

這是LINQ到對象,因爲你是在內存中查詢的Teams集合。所以它假定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

假設有一個多對多的關係中間人的團隊和用戶,並且用戶不會兩次部分在同一支球隊的。

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

實體框架無法將您重寫的c#代碼轉換爲等於sql函數。

+0

你確定嗎? 因爲我使用了'UserIsInTeamOfCourse'兩次。一次從控制器限制對操作的訪問權限,一次從視圖中顯示「加入」按鈕或將其隱藏。 如果我從控制器調用方法,它會調用User類的'Equals'方法。如果方法被視圖調用,它不會訪問「Equals」方法。 – Gesh

+0

這就是LINQ to Entities(又名實體框架)和LINQ to Objects之間的區別。 – BennyM

0

,而不是比較自定義對象的比較用戶ID(這可能是int或其他簡單類型)

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