Entity framework 具有实体框架继承的webapi

Entity framework 具有实体框架继承的webapi,entity-framework,asp.net-core-webapi,Entity Framework,Asp.net Core Webapi,假设我有以下实体: abstract class User { string Id string Name } class UserA : User { List<UserB> Bs } class UserB : User { string UserAId [ForeignKey("UserAId"), JsonIgnore] UserA UserA } 如何在没有额外属性的情况下获取集合 [ { "

假设我有以下实体:

abstract class User
{
    string Id 
    string Name 
}

class UserA : User
{
    List<UserB> Bs
}

class UserB : User
{
    string UserAId
    [ForeignKey("UserAId"), JsonIgnore]
    UserA UserA
}
如何在没有额外属性的情况下获取集合

[
    {
        "id": "0",
        "name": "User A",
        "Bs": [
            {
                "id": "1"
            },
            {
                "id": "2"
            }
        ]
    },
    {
        "aId": "0",
        "id": "1",
        "name": "User B 1"
    },
    {
        "aId": "0",
        "id": "2",
        "name": "User B 2"
    }
]

并从“Bs”集合返回此json,不带“aId”和“name”

要从类型UserA的Bs集合返回ID,需要根据类型筛选出值,然后在Bs集合上使用SelectMany

[
    {
        "id": "0",
        "name": "User A",
        "Bs": [
            {
                "id": "1",   
                "name" : ....  
                "aId": ....
            },
            {
                "id": "2",      
                "name" : .... 
                "aId": ....
            }
        ]
    },
    {
        "aId": "0",
        "id": "1",
        "name": "User B 1"
    },
    {
        "aId": "0",
        "id": "2",
        "name": "User B 2"
    }
]
[HttpGet]
public IEnumerable<int> Get()
{
   return _context.Where(e => (e is UserA))
                  .Select(u => (UserA)u)
                  .SelectMany(b => b.Bs)
                  .ToList();
}
[HttpGet]
公共IEnumerable Get()
{
返回_context.Where(e=>(e是UserA))
.选择(u=>(UserA)u)
.SelectMany(b=>b.Bs)
.ToList();
}

我认为您可以使用select语句来投影id,如:

_context.Users.Select(user => user.id)
您必须更改退货类型

参考:

我用这个方法解决了这个问题:

[HttpGet]
public IEnumerable<dynamic> Get()
{
    IEnumerable<dynamic> res = _context.Users.OfType<UserA>()
        .Select(u => new {Id = u.Id, Name = u.Name, Users =  u.Users.Select(ui => new  { Id = ui.Id }) })
        .ToArray();

    res = res.Concat<dynamic>(_context.Users.OfType<UserB>());

    return res;
}
[HttpGet]
公共IEnumerable Get()
{
IEnumerable res=_context.Users.OfType()
.Select(u=>new{Id=u.Id,Name=u.Name,Users=u.Users.Select(ui=>new{Id=ui.Id})})
.ToArray();
res=res.Concat(_context.Users.OfType());
返回res;
}

我只需要“Bs”集合中的ID谢谢Marcus,我有两个问题-我无法从users集合中选择Many(u=>u.Bs),因为Bs只是UserA的一个属性-我需要IEnumerable类型的结果,我用一个示例更新了问题。我只需要“Bs”集合中的ID
[HttpGet]
public IEnumerable<dynamic> Get()
{
    IEnumerable<dynamic> res = _context.Users.OfType<UserA>()
        .Select(u => new {Id = u.Id, Name = u.Name, Users =  u.Users.Select(ui => new  { Id = ui.Id }) })
        .ToArray();

    res = res.Concat<dynamic>(_context.Users.OfType<UserB>());

    return res;
}