Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EF从ASP.NET MVC返回特定格式的JSON_C#_Asp.net Mvc_Json_Linq_Entity Framework - Fatal编程技术网

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

C# 使用EF从ASP.NET MVC返回特定格式的JSON,c#,asp.net-mvc,json,linq,entity-framework,C#,Asp.net Mvc,Json,Linq,Entity Framework,我有一个如下的模型,权限组与权限有1-Many关系,权限和角色有多个Many-Many关系 PermissionGroup 1-----* Permission *--------* Role 我必须能够以以下格式返回JSON: PermissionGroupId : 1, PermissionGroupName : "Market", Permissions : [ {PermissionId : 1, PermissionName : "Create"}, {PermissionId

我有一个如下的模型,权限组与权限有1-Many关系权限和角色有多个Many-Many关系

PermissionGroup 1-----* Permission *--------* Role
我必须能够以以下格式返回JSON:

PermissionGroupId : 1,
PermissionGroupName : "Market",
Permissions : [
 {PermissionId : 1, PermissionName : "Create"},
 {PermissionId : 2, PermissionName : "Update"}
]
将要求提供特定的
RoleId

问题:

因为,
PermissionGroup
Role
没有直接关系,所以我无法执行
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);
}
非常感谢您的建议。

您可以在
中的
中使用该方法?像这样:

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

我找到了这样做的方法,但高度怀疑它是否有效

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);
var getPermissionsErrorle=context.Roles.Where(roleid=>roleid.roleid==1)。选择(p=>p.Permissions.ToList();
var getAllPermissionGroup=context.PermissionGroups.ToList();
List jsonPg=新列表();
foreach(getAllPermissionGroup中的var pg)
{
PermissionGroup newPg=新PermissionGroup();
newPg.PermissionGroupId=pg.PermissionGroupId;
newPg.PermissionGroupName=pg.PermissionGroupName;
newPg.Permissons=新列表();
foreach(GetPermissionsError[0]中的变量pers)
{
if(pers.PermissionGroup.PermissionGroupId==pg.PermissionGroupId)
{
权限newPe=新权限();
newPe.PermissionId=pers.PermissionId;
newPe.PermissionName=pers.PermissionName;
newPg.Permissons.Add(newPe);
}
}
如果(newPg.Permissons.Count>0)
{
jsonPg.Add(newPg);
}
}
var json=JsonConvert.SerializeObject(jsonPg);

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

您的json没有任何
角色
成员。满了吗?什么是
roleid
?它是如何与
许可组连接的?@Tony感谢您的评论。是的,它没有,而且它是完整的JSON规范。当时我想不出其他任何东西。所以,我尝试了我的想法
RoleId
角色
实体的主要标识符。请参考我在上面发布的图表了解他们的关系。谢谢你的回答。但我想我以前没能向你解释清楚。请再看一下修改后的问题。效率不高,因为你做了2次查询,比1次查询更糟糕。我相信你可以在一个查询中完成。更不用说这是一个丑陋的代码。谢谢你的帮助。你把我从很多坏习惯中救了出来。不客气!我还想说的是,尽管这段代码并不完美,但您尝试做一些事情,尝试找到解决方法(您确实做到了!),这是非常棒的。这是你性格中很好的一面。