2010-01-04 93 views
3

我有安全簡單的模型,其中有:實體框架多個多對多查詢

  • 用戶
  • 角色
  • 路徑

,許多這些表之間有很多聯繫,所以用戶角色和角色到路徑。我正在嘗試編寫一個函數,以便根據用戶是否有權訪問該路徑,從用戶名和路徑中返回一個bool值。我如何用實體框架來做到這一點?我目前有:

var rolesForUser = _entities.Users 
     .Include("Roles") 
     .Where(u => u.Login.Equals(username)) 
     .Select(u => u.Roles); 

if(rolesForUser.Count() == 0) return false; 

var authentications = _entities.WebPaths 
     .Where(p => p.Path == path) 
     .WhereIn(p => p.Roles, rolesForUser); 

return (authentications.Count() > 0); 

它使用一個擴展方法WhereIn,但是這隻能在primatives比較所以這不會在瞬間工作。歡迎任何建議。

回答

1

你可以用PredicateBuilder來做。

關閉我的頭頂:

var predicate = PredicateBuilder.False<WebPath>(); 
foreach (var role in from roles in rolesForUser 
        from r in roles.Role 
        select r) 
{ 
    predicate = predicate.Or (p => p.roles.Any(r => r.Id == role.Id)); 
} 

var authentications = _entities.WebPaths.AsExpandable() 
     .Where(p => p.Path == path) 
     .Where(predicate); 
return (authentications.Count() > 0); 
+0

嗨克雷格,剛剛與此一去,就行了:「謂詞= predicate.Or(P => p.roles.Any(R => r.Id == role.Id));「我無法訪問role.Id作爲角色是System.Data.Objects.DataClasses.EntityCollection對象而不是System.Data.Objects.ObjectQuery 。我想這是由於我如何在rolesForUser中進行選擇,儘管我不確定如何讓它返回。 – bobwah 2010-01-04 15:45:06

+0

「rolesForUser」的* exact *類型(帶參數)是什麼? – 2010-01-04 16:15:00

+0

(局部變量)IQueryable > rolesForUser – bobwah 2010-01-04 16:32:36