Веб-API с наследованием Entity Framework - PullRequest
0 голосов
/ 11 сентября 2018

Предположим, у меня есть следующие объекты:

abstract class User
{
    string Id 
    string Name 
}

class UserA : User
{
    List<UserB> Bs
}

class UserB : User
{
    string UserAId
    [ForeignKey("UserAId"), JsonIgnore]
    UserA UserA
}

Я хочу загрузить их все в одном запросе и получить только идентификатор коллекции.Например, если вернуть

[HttpGet]
public IEnumerable<Usuario> Get()
{
   return _context.Users.ToList();
}

Ответ включает все данные из коллекции "Bs"

[
    {
        "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"
    }
]

Как получить коллекцию без дополнительных свойств?

[
    {
        "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"
    }
]

И вернуть этот json без "aId" и "name" из коллекции "Bs"

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Я думаю, что вы можете использовать оператор select для проецирования идентификатора как:

_context.Users.Select(user => user.id)

Вам придется изменить тип возвращаемого значения

Ссылка: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/method-based-query-syntax-examples-projection

0 голосов
/ 12 сентября 2018

Я решил эту проблему с помощью этого метода:

[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;
}
0 голосов
/ 11 сентября 2018

Чтобы вернуть идентификаторы из коллекции Bs типа UserA, необходимо отфильтровать значения на основе типа, а затем использовать SelectMany для коллекции Bs

[HttpGet]
public IEnumerable<int> Get()
{
   return _context.Where(e => (e is UserA))
                  .Select(u => (UserA)u)
                  .SelectMany(b => b.Bs)
                  .ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...