Linq - 乐观地选择权限行

问题描述 投票:-1回答:1

我有一个情况;用户附加到多个角色,如下面的json所示

[
    {
        "userid" : 1,
        "roleid" : 1
    },
    {
        "userid" : 1,
        "roleid" : 2
    }
]

每个角色都包含许多功能权限(json如下)

[
    {
        "roleid" : 1,
        "FeatureName": "AddUser",
        "Accessible": true,
    },
    {
        "roleid" : 1,
        "FeatureName": "AddEmp",
        "Accessible": true,
    },
    {
        "roleid" : 2,
        "FeatureName": "AddUser",
        "Accessible": false,
    },
    {
        "roleid" : 2,
        "FeatureName": "AddEmp",
        "Accessible": false,
    }
]

我需要一个linq查询,选择为该用户选择最佳权限列表。我目前在列表下方(在Json中)

[
    {
        "accessid": 1,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddUser",
        "Accessible": true,
    },
    {
        "accessid": 2,
        "roleid" : 2,
        "userid" :1,
        "FeatureName": "AddUser",
        "Accessible": false,
    },
    {
        "accessid": 3,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddEmp",
        "Accessible": true,
    },
    {
        "accessid": 4,
        "roleid" : 2,
        "userid" :1,
        "FeatureName": "AddEmp",
        "Accessible": false,
    },
    {
        "accessid": 5,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddRoles",
        "Accessible": false,
    }
]

我现在想要的只是为用户设置的一组乐观权限,如下所示

[
    {
        "accessid": 1,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddUser",
        "Accessible": true,
    },
    {
        "accessid": 3,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddEmp",
        "Accessible": true,
    },
    {
        "accessid": 5,
        "roleid" : 1,
        "userid" :1,
        "FeatureName": "AddRoles",
        "Accessible": false,
    }
]

PS:我不打算在json结束时错过了roleid。我尝试了许多linqs但无法到达所需的json。任何帮助表示赞赏。

c# linq
1个回答
0
投票

假设你有一个类名Access作为结果模型

public class Access
{
    public int accessid { get; set; }
    public int roleid { get; set; }
    public int userid { get; set; }
    public string FeatureName { get; set; }
    public bool Accessible { get; set; }
}

而且你找到了一种方法来为用户查询Access,然后你可以使用LINQ下面的方法来优化结果

编辑更新,结果包含拒绝(Accessible=false)结果

 var optimised = from o in accesses
                 group o by new { o.userid, o.FeatureName } into g
                 select new Access()
                 {
                     userid = g.Key.userid,
                     FeatureName = g.Key.FeatureName,
                     //OrderByDescending put the true before the false
                     Accessible = g.OrderByDescending(t => t.Accessible).First().Accessible,

                     //you might want to comment the accessid and roleid
                     accessid = g.First().accessid,
                     roleid = g.First().roleid,
                 };
© www.soinside.com 2019 - 2024. All rights reserved.