簡體   English   中英

實體框架復雜的多個 where 條件

[英]Entity Framework complex multiple where condition

我有一個數據庫,我試圖在其中跟蹤文檔審批。 每個文檔有 1 個或多個任務。 每個任務都有 1 個或多個批准。 每個批准都有分配給分配的用戶和分配的組的 ID。 每個用戶可能屬於 1 個或多個組,並且在每個組中可能擁有不同的權限。 此信息存儲在“多對多”關系表中,並具有用於權限級別的附加字段。 (user_id, group_id,permission_id)

例如,對任務的批准可以分配給 ID=5 的用戶和 ID=7 的組。 為了讓用戶批准此批准,他們的用戶 ID 必須為 5 或屬於具有批准權限的組 7。

我想創建一個查詢,該查詢選擇分配給特定用戶或屬於特定用戶具有“意識”權限的組的所有批准。

我已經能夠輕松地查詢用戶 ID:

var approvals = context.APPROVALS
                       .Where(a => a.APPROVER_ID == CurrentUserID)
                       .ToList();

我的問題還在於檢查當前用戶具有“意識”權限的組。 我能想到的最好的方法是存儲用戶“意識”組的列表(在下面的示例中存儲為 CurrentUserAwarnessGroups)並執行如下操作:

var approvals = context.APPROVALS
                       .Where(a => a.APPROVER_ID == CurrentUserID || CurrentUserAwarnessGroups.Contains(a.GROUP_ID))

這個查詢方法對我來說失敗了,更不用說我假設它必須至少在客戶端執行這個查詢的一部分,這意味着返回一個更大(更長)的查詢。

任何人都可以提出更好的方法來執行此功能嗎? 如有必要,我可以更改我的數據庫。

所以我能夠想出一個更好的方法。 我的做法是錯誤的。 我沒有嘗試查詢批准並包含相關用戶,而是按用戶查詢並純粹基於他們的組包含相關批准。 我確定批准組將始終包含批准者 ID,因此我可以單獨按組查詢數據庫,然后在客戶端計算機上按批准者進行過濾。 此外,通過使用按位比較來控制 mxmissile 推薦的“成員資格”,我能夠簡化我的組到用戶表。

我的解決方案如下:

var user = context.USERs
                  .Where(u => u.USER_ID == CurrentUserID)
                  .FirstOrDefault();

var tempUserApprovals = user.GROUPTOUSER.SelectMany("GROUP.APPROVALS");
var userApprovals = new ObservableCollection<APPROVAL>();

foreach(var approval in tempUserApprovals)
{
    foreach(var group in CurrentUsersGroups)
    {
        if(approval.GROUP.GROUP_ID == group.GROUP_ID && ((int)group.MEMBERSHIP & Membership.is_aware == Membership.is_aware || approval.APPROVER_ID == CurrentUserID))
        {
            userApprovals.Add(approval);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM