2013-05-17 142 views
0

我開發與ASP.net MVC Web應用程序和我有我與ADO.NET實體框架連接的數據庫。從關聯訪問一個記錄集

在這個數據庫中,我有一個以GroupId作爲主鍵的組表,另一個表UserInfo以UserId作爲其主鍵,另一個表GroupUser不被視爲實體,這意味着Group和User之間有多對多的關係。

GroupUser包含GroupIdUserId作爲組合鍵,兩者都是各自表的外鍵。

這些都是產生GroupUser類(關於這個關係)

// Group 
public Group() 
{ 
    this.UserInfo1 = new HashSet<UserInfo>(); 
} 

public virtual UserInfo UserInfo { get; set; } 
public virtual ICollection<UserInfo> UserInfo1 { get; set; } 

// UserInfo 
public UserInfo() 
{ 
    this.Group = new HashSet<Group>(); 
    this.Group1 = new HashSet<Group>(); 
} 

public virtual ICollection<Group> Group { get; set; } 
public virtual ICollection<Group> Group1 { get; set; } 

將記錄添加到這個GroupUser表我這樣做

int ownerId = Convert.ToInt32(WebSecurity.CurrentUserId); 
group.UserInfo1.Add(conn.UserInfo.Find(ownerId)); 

但是我堅持就如何在此表中找到一條記錄。如何通過在此處提供groupId和userId來檢查特定用戶是否屬於此組?

Group group = conn.Group.Find(id); 
int userId = Convert.ToInt32(WebSecurity.CurrentUserId); 

感謝所有幫助:)

回答

1

隨着你,以測試提供的起點,如果用戶是該組中,你可以使用:

Group group = conn.Group.Find(id); 
int userId = Convert.ToInt32(WebSecurity.CurrentUserId); 

bool isUserInGroup = group.UserInfo1.Any(u => u.UserId == userId); 

它會工作,因爲當你(在這種情況下,與Any擴展方法)訪問group.UserInfo1實體框架將運行第二個查詢(第一個是Find)給定group的所有相關UserInfo實體加載到group.UserInfo1集合。此查詢基於在延遲加載在缺省情況下,如果導航集合聲明爲virtual(它是在你的例子)啓用。加載集合後,Any通話是在內存中進行檢查(無數據庫查詢在這裏了)如果group.UserInfo1集包含的滿足提供的條件至少一個實體,即包含與userId用戶。

然而,這是不是最好的解決方案,因爲 - 因爲說 - 這將導致兩個查詢(Find和集合的延遲加載)。其實你可以測試用戶是否是該組中僅由一個單一的數據庫查詢,你甚至不需要加載任何實體爲測試,只需直接從數據庫返回bool結果:

int userId = Convert.ToInt32(WebSecurity.CurrentUserId); 

bool isUserInGroup = conn.Group 
    .Any(g => g.GroupId == id && g.UserInfo1.Any(u => u.UserId == userId)); 

的結果將是false如果與id該組不存在,或者如果它不具有相關用戶與userId

+0

非常感謝@Slauma的詳細解答!你幫我充分理解了這一點。 +1 :) – Bernice