2017-08-09 160 views
0

嘗試在Linq查詢中使用導航屬性,但沒有得到任何結果。不知道爲什麼。使用帶導航屬性的Linq

我在實體框架中使用SQL Server中的標準簡單成員表。所以我把三個表格,AspNetUsers,AspNetRoles和AspNetUserRoles放到我的模型中(見下圖)

是的,我知道我可以使用角色/標識功能,我只是用這些表來試用這個LINQ QUERY,這些表格很方便使用

無論如何,我的目標是使用導航屬性來獲取給定用戶的角色。由於AspNetUserRoles沒有主鍵,因此不會作爲實體進入我的模型,所以這似乎是正確的選擇。我試着使用建議這裏提出:

Linq to entities navigation properties

下面的LINQ查詢返回0結果

var result = (from r in context.AspNetRoles 
     where r.AspNetUsers.Any(u => u.Id == UserId) 
     select r).ToList(); 
return result; 

想也許我需要使用包含擴展,所以我想這一點,也將返回0結果

var result = (from r in context.AspNetRoles 
      where r.AspNetUsers.Any(u => u.Id == UserId) 
      select r).Include("AspNetUsers").ToList(); 
return result; 

我知道我在做什麼錯行:

where r.AspNetUsers.Any(u => u.Id == UserId) 

因爲如果我刪除它,當然會得到結果,但不是特定用戶的結果。

我試圖按照這裏的一個答案給出的建議是:

任何想法?

在此先感謝!

+0

什麼是你真正想幹什麼?給出一些上下文,最好是一個或兩個示例模型。 – stybl

+0

@stybl,編輯了這個問題。我希望這有助於澄清。謝謝! – xgp

回答

0

如果我理解正確的話,你希望讓所有基於其ID的用戶的角色。

除非有一些關於您的用戶模型的信息,否則無法在訪問AspNetUserRoles時得到此信息。

如果您可以訪問該表,那麼這將成爲真正簡單:

var result = AspNetUserRoles.Where(role => role.UserId == UserId) 
    .Select(userRole => AspNetRoles.First(role => role.Id == userRole.RoleId)); 

或者在查詢語法:

var result = from userRole in AspNetUserRoles 
      where userRole.UserId == UserId 
      from role in AspNetRoles 
      where role.Id == userRole.RoleId 
      select role; 
+0

問題與您的查詢是,即使我將AspNetUserRoles包括到.edmx圖中,它不會被導入爲可查詢實體,因爲它沒有主鍵 - 因此,它的存在用於建立AspNetUser和AspNetRoles之間的導航屬性。即使我在選擇我的表格時將其包含在EF模型中,也沒有AspNetUserRoles實體。據我瞭解,這是EF如何工作。思考? – xgp