2014-10-09 70 views
1

下面顯示的查詢非常簡單,它將簡單地爲特定客戶提取任務。我現在希望能夠做的是獲取傳遞給此函數的UserId,並驗證用戶是否有權查看任務。EF複雜查詢加入

  var dbData = await db.Tasks 
       .Where(a => a.CustomerId == customerId) 
       .OrderBy(a => a.CreatedDateTime).ToListAsync(); 

OrganizationId的Tasks表中有一個屬性。用戶可以通過UserOrganizations表屬於n + 1組織。採取已知的UserId並驗證Task.OrganizationId的最佳方法是用戶的?

回答

1

如果關係不是Tasks類的屬性,那麼可以使用查詢語法編寫聯接。沿着這些路線的東西:

var dbData = await (from t in db.Tasks 
        join uo in UserOrganizations on t.OrganizationId equals uo.OrganizationId 
        join u in Users on uo.UserId equals u.UserId 
        where t.CustomerId == customerId && u.UserId == theUserId 
        order by t.CreatedDateTime 
        select t).ToListAsync(); 

根據如何您的數據類,其中產生的,你可能已經對Tasks類導航屬性,讓你做:

var dbData = await db.Tasks 
      .Where(a => a.CustomerId == customerId && a.Organization.UserOrganizations.Any(uo => uo.UserId == theUserId) 
      .OrderBy(a => a.CreatedDateTime).ToListAsync(); 
+0

這很好......如果我想要返回組織的用戶列表,但爲了返回數據,那麼當前用戶必須在該組織中呢? – RSolberg 2014-10-10 17:24:01

0
var dbData = await db.Tasks 
       .Where(a => a.CustomerId == customerId 
         && a.Organization.Users 
             .Any(u=>u.UserId == customerId))) 
       .OrderBy(a => a.CreatedDateTime).ToListAsync(); 

這是送給外鍵被設置並且關係可以通過實體導航。