.net 如何在缓存中存储角色权限以获得最佳结果?

.net 如何在缓存中存储角色权限以获得最佳结果?,.net,arrays,caching,.net,Arrays,Caching,我在DB中有一个表,其中有两列,角色和权限,如下所示: 角色权限 用户附加项 管理-删除项 管理员-高级搜索 来宾-简单搜索 用户-编辑项 管理员-编辑用户 ……等等 我需要将它们存储在.net的缓存中,以便检查是否存在特定角色的权限 这是psuedo代码 但是,如何将它们添加并存储在缓存中以获得最佳结果 在PHP中,我想我会这样做: array ( "user" => array ( "addItem", "editItem"), "admin" => arra

我在DB中有一个表,其中有两列,角色和权限,如下所示:

角色权限 用户附加项 管理-删除项 管理员-高级搜索 来宾-简单搜索 用户-编辑项 管理员-编辑用户 ……等等

我需要将它们存储在.net的缓存中,以便检查是否存在特定角色的权限

这是psuedo代码

但是,如何将它们添加并存储在缓存中以获得最佳结果

在PHP中,我想我会这样做:

array ( "user"  => array ( "addItem", "editItem"),
        "admin"  => array ( "removeItem", "advancedSearch"),
         ....
在C语言中有没有一种等效的或更好/更快的方法

谢谢! /Niklas

也许是字典之类的东西

例如:

var pairs = new[] { 
    new{Role="user",Permission="addItem"},
    new{Role="admin",Permission="removeItem"},
    new{Role="admin",Permission="advancedSearch"},
    new{Role="guest",Permission="simpleSearch"},
    new{Role="user",Permission="addItem"},
    new{Role="manager",Permission="editUser"},
};
Dictionary<string, HashSet<string>> cache = pairs.GroupBy(pair => pair.Role)
    .ToDictionary(grp => grp.Key, grp => new HashSet<string>(
          grp.Select(g => g.Permission)));
cache["user"].Contains("addItem");
或者,如果从数据读取器注释中读取:

var cache = new Dictionary<string, HashSet<string>>();
using (var reader = GetReader()) {
    while (reader.Read()){
        string role = reader.GetString(0),
            permission = reader.GetString(1);
        HashSet<string> permissions;
        if (!cache.TryGetValue(role, out permissions)){
            cache.Add(role, permissions = new HashSet<string>());
        }
        permissions.Add(permission);
    }
}
也许是字典之类的

例如:

var pairs = new[] { 
    new{Role="user",Permission="addItem"},
    new{Role="admin",Permission="removeItem"},
    new{Role="admin",Permission="advancedSearch"},
    new{Role="guest",Permission="simpleSearch"},
    new{Role="user",Permission="addItem"},
    new{Role="manager",Permission="editUser"},
};
Dictionary<string, HashSet<string>> cache = pairs.GroupBy(pair => pair.Role)
    .ToDictionary(grp => grp.Key, grp => new HashSet<string>(
          grp.Select(g => g.Permission)));
cache["user"].Contains("addItem");
或者,如果从数据读取器注释中读取:

var cache = new Dictionary<string, HashSet<string>>();
using (var reader = GetReader()) {
    while (reader.Read()){
        string role = reader.GetString(0),
            permission = reader.GetString(1);
        HashSet<string> permissions;
        if (!cache.TryGetValue(role, out permissions)){
            cache.Add(role, permissions = new HashSet<string>());
        }
        permissions.Add(permission);
    }
}

基于Marcs answer,您可以直接内联使用集合初始值设定项:

var cache = new Dictionary<string, HashSet<string>>()
    {
        { "user", new HashSet<string>() { "addItem" } },
        { "admin", new HashSet<string>() { "removeItem", "advancedSearch" } },
        { "guest", new HashSet<string>() { "simpleSearch" } }
    };

看起来比LINQ版本要干净一点,您应该对PHP背景比较熟悉,因为语法非常相似。

基于Marcs answer,您可以直接内联使用集合初始值设定项:

var cache = new Dictionary<string, HashSet<string>>()
    {
        { "user", new HashSet<string>() { "addItem" } },
        { "admin", new HashSet<string>() { "removeItem", "advancedSearch" } },
        { "guest", new HashSet<string>() { "simpleSearch" } }
    };

看起来比LINQ版本要干净一点,您应该对PHP背景比较熟悉,因为语法非常相似。

谢谢,我希望我能标记两个答案。因此,要在您的案例中添加角色->缓存权限,正确的语法是什么样的?在从SQLdatareader读取时,我需要迭代添加这些值。@Niklas,我的版本只针对已知的编译时值,这对您的用例不是很有用。如果可能的话,我建议使用LINQtoSQL之类的工具,而不是使用DataReader。这会让你的生活轻松很多。谢谢,我希望我能给出两个答案。因此,要在您的案例中添加角色->缓存权限,正确的语法是什么样的?在从SQLdatareader读取时,我需要迭代添加这些值。@Niklas,我的版本只针对已知的编译时值,这对您的用例不是很有用。如果可能的话,我建议使用LINQtoSQL之类的工具,而不是使用DataReader。这会让你的生活轻松很多。这只是一个很好的答案。我需要在从SqlDataReader读取时迭代地添加这些。这样做的正确语法是什么?无论你是脚本、机器人还是真实的人类。。。you's saving lifes=等等,如何检查缓存是否包含附加项?返回false:cache[user].ContainsaddItem;而这将返回true:cache[user].Containsuser@niklas-cache[role].ContainesMission应该这样做这是一个很好的答案,就像Marks的一样。我需要在从SqlDataReader读取时迭代地添加这些。这样做的正确语法是什么?无论你是脚本、机器人还是真实的人类。。。you's saving lifes=等等,如何检查缓存是否包含附加项?返回false:cache[user].ContainsaddItem;而这将返回true:cache[user].Containsuser@niklas-cache[role]。ContainessPermission应该这样做