【问题标题】:Using EF to return specific formatted JSON from ASP.NET MVC使用 EF 从 ASP.NET MVC 返回特定格式的 JSON
【发布时间】:2014-03-13 07:47:30
【问题描述】:

我有一个类似下面的模型,其中 PermissionGroup 与 Permission 有 1-Many 关系Permission 和 Roles 有 Many-Many 关系

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);
}

欢迎提出任何建议。

【问题讨论】:

  • 您的 json 没有任何 Roles 成员。满了吗? roleid 是什么?与PermissionGroups是如何联系的?
  • @Tony 感谢您的评论。是的,它没有,它是完整的 JSON 规范。我当时想不出别的。所以,我尝试了我的想法。 RoleIdRole 实体的主要标识符。请参阅我上面发布的图表了解它们的关系。

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


【解决方案1】:

您可以在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
        })
    });

【讨论】:

  • 感谢您的回答。但我想我以前无法正确地向你解释。请再看一遍修改后的问题。
【解决方案2】:

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

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);

仍然对更好的代码持开放态度。

【讨论】:

  • 效率不高,因为您进行了 2 个查询,这比 1 个查询最差。我相信您可以在 1 个查询中完成。
  • 更不用说这是一个丑陋的代码。谢谢你的帮助。你让我免于许多糟糕的做法。
  • 不客气!我还想说,尽管这段代码并不完美,但你正在尝试做一些事情,试图找到解决方法(而且你确实做到了!)。这是你性格中非常好的一面。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2023-03-18
  • 2010-12-04
相关资源
最近更新 更多