使用EF从ASP.NET MVC返回特定格式的JSON

时间:2014-02-14 04:48:22

标签: c# asp.net-mvc json linq entity-framework

我有一个类似下面的模型,其中 PermissionGroup与权限有很多关系权限和角色有很多关系

PermissionGroup 1-----* Permission *--------* Role

我必须能够以下列格式返回JSON:

PermissionGroupId : 1,
PermissionGroupName : "Market",
Permissions : [
 {PermissionId : 1, PermissionName : "Create"},
 {PermissionId : 2, PermissionName : "Update"}
]

将要求提供具体的RoleId

问题:

因为,PermissionGroupRole没有直接关系所以我无法进行Where linq查询。我可以做以下事情,但它没有像上面那样返回所需的结果。

public JsonResult GetRolePermission(int roleid)
{
    var list = con.PermissionGroups.Select(pg => new
    {
        PermissionGroupId = pg.PermissionGroupId,
        PermissionGroupName = pg.PermissionGroupName,
        Permissions = pg.Permissons.Select(pe => new
        {
            PermissionId = pe.PermissionId,
            PermissionName = pe.PermissionName
        }) 
    })//Maybe do the where query here somehow like where(f => f.RoleId == roleid);

    return Json(list);
}

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以在Where中使用Any方法吗?像这样:

var list = con.PermissionGroups
    .Where(pg => pg.Permissons.Any(p => p.Roles.Any(r => r.RoleId == roleId)))
    .Select(pg => new
    {
        PermissionGroupId = pg.PermissionGroupId,
        PermissionGroupName = pg.PermissionGroupName,
        Permissions = pg.Permissons.Select(pe => new
        {
            PermissionId = pe.PermissionId,
            PermissionName = pe.PermissionName
        })
    });

答案 1 :(得分:0)

我找到了一种方法来做到这一点但高度怀疑它是否有效。

var getPermissionsForRole = context.Roles.Where(roleid => roleid.RoleId == 1).Select(p => p.Permissions).ToList();
var getAllPermissionGroup = context.PermissionGroups.ToList();

List<PermissionGroup> jsonPg = new List<PermissionGroup>();

foreach (var pg in getAllPermissionGroup)
{
    PermissionGroup newPg = new PermissionGroup();
    newPg.PermissionGroupId = pg.PermissionGroupId;
    newPg.PermissionGroupName = pg.PermissionGroupName;
    newPg.Permissons = new List<Permission>();

    foreach (var pers in getPermissionsForRole[0])
    {
        if (pers.PermissionGroup.PermissionGroupId == pg.PermissionGroupId)
        {
            Permission newPe = new Permission();
            newPe.PermissionId = pers.PermissionId;
            newPe.PermissionName = pers.PermissionName;

            newPg.Permissons.Add(newPe);
        }
    }

    if (newPg.Permissons.Count > 0)
    {
        jsonPg.Add(newPg); 
    }
}

var json = JsonConvert.SerializeObject(jsonPg);

仍然可以使用更好的代码。