簡體   English   中英

使用LINQ根據字符串中的ID獲取多個字段

[英]Get multiple fields based on ids in a string using LINQ

我有兩個表:Table1: RolesTable和Table2: PrivilegeTable

RolesTable中的樣本數據

Name |Description           |ModulePrivIds|FunctionPrivIds|Active
=================================================================
Role1|This is a Test Role   |1,2          |3,4            |1
Role2|This is another Role  |2,3          |1,3            |0

注意: ModulePrivIdFunctionPrivIds對應於PrivilegeTable中的 ID

PrivilegeTable中的樣本數據

ID | Name |Description
========================
1  |Priv1 |This is Priv1
2  |Priv2 |This is Priv2
3  |Priv3 |This is Priv3
4  |Priv4 |This is Priv4

現在我想在所有角色的網格中顯示數據。因此,我想使用Privilege Table顯示特權名稱,而不是ModulePrivId和FunctionPrivIds。

這是我正在嘗試但無法達到預期效果的方法。

var answer = (from r in database.RolesRepository.Get()
            join p in database.PrivilegesRepository.Get()
            on r.ModulePrivilegeIds equals p.Id.ToString() into ModuleWisePrivileges
            from p1 in ModuleWisePrivileges.DefaultIfEmpty()

            from r1 in database.RolesRepository.Get()
            join p01 in database.PrivilegesRepository.Get()
            on r1.FunctionPrivilegeIds equals p01.Id.ToString() into FunctionWisePrivileges
            from p2 in FunctionWisePrivileges.DefaultIfEmpty()

            select new
            {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = ModuleWisePrivileges,
                FunctionWisePrivileges = FunctionWisePrivileges,
                Active = r.Active

            }).ToArray();

return answer;

我也嘗試了以下方法,但沒有成功。

var answer = (from r in database.RolesRepository.Get()
            join p in database.PrivilegesRepository.Get()
            on p.Id.ToList().Where(p => Id.Contains(r.ModulePrivilegeIds.ToString()) into ModuleWisePrivileges)
            from p1 in ModuleWisePrivileges.DefaultIfEmpty()

            from r1 in database.RolesRepository.Get()
            join p01 in database.PrivilegesRepository.Get()
            on r1.FunctionPrivilegeIds equals p01.Id.ToString() into FunctionWisePrivileges
            from p2 in FunctionWisePrivileges.DefaultIfEmpty()

            select new
            {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = ModuleWisePrivileges,
                FunctionWisePrivileges = FunctionWisePrivileges,
                Active = r.Active

            }).ToArray();

如果您無法修復數據庫,則需要執行多個步驟:

  1. RolesTable選擇行
  2. 分割ID字段
  3. 從數據庫中選擇特權

像這樣:

var roles = database.RolesRepository.Get().ToArray();
var answers = roles.Select(r => new {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = r.ModulePrivilegeIds.Split(',')
                                        .Select(x => database.PrivilegesRepository.Get(x))
                                        .ToArray(),
                FunctionWisePrivileges = r.FunctionPrivilegeIds.Split(',')
                                          .Select(x => database.PrivilegesRepository
                                                               .Get(x))
                                          .ToArray(),
                Active = r.Active
            }

如果您的存儲庫允許您基於ID列表一次獲取多個項目,則可以提高性能。
如果特權列表很小,最好先將它們全部存儲到內存中:

var roles = database.RolesRepository.Get().ToArray();
var privileges = database.PrivilegesRepository.Get().ToDictionary(x => x.Id, x => x);
var answers = roles.Select(r => new {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = r.ModulePrivilegeIds.Split(',')
                                        .Select(x => privileges[x])
                                        .ToArray(),
                FunctionWisePrivileges = r.FunctionPrivilegeIds.Split(',')
                                          .Select(x => privileges[x])
                                          .ToArray(),
                Active = r.Active
            }

選中一次,用逗號分隔值更新以上代碼

var roles = database.RolesRepository.Get().ToArray();
var answers = roles.Select(r => new {
            Name = r.Name,
            Description = r.Description,
            ModuleWisePrivileges = string.Join(", ", (r.ModulePrivilegeIds.Split(',')
                                    .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                    .ToArray()),
            FunctionWisePrivileges = string.Join(", ", (r.FunctionPrivilegeIds.Split(',')
                                      .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                      .ToArray()),
            Active = r.Active
        }

根據您的評論更新了查詢

 var roles = database.RolesRepository.Get().ToArray();
 var answers = roles.Where(a => a.isDeleted == false).Select(r => new {
        Name = r.Name,
        Description = r.Description,
        ModuleWisePrivileges = string.Join(", ", (r.ModulePrivilegeIds.Split(',')
                                .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                .ToArray()),
        FunctionWisePrivileges = string.Join(", ", (r.FunctionPrivilegeIds.Split(',')
                                  .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                  .ToArray()),
        Active = r.Active
    }

暫無
暫無

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

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