Запрос объекта со списком списков списков - PullRequest
0 голосов
/ 17 октября 2018

Я хочу запросить базу данных и получить спортивный объект, содержащий все внутренние списки, но по какой-то причине я пропускаю, выборка идет только на 2 уровня в списках, любые глубины и свойство lists имеет значение null, пример структуры

public class Sports
{
    public int id { get; set; }
    public string name { get; set; }
    public List<League> leagues { get; set; }
}
public class League
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public List<Team> teams { get; set; }
}
public class Team
{
    public int id { get; set; }
    public string name { get; set; }
    public string successrate { get; set; }
    public List<Player> players { get; set; }
}
public class Player
{
    public int id { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}

Я создал свойство в файле MyAppContext следующим образом:

public DbSet<Sports> sports { get; set; }

Теперь, когда я вызываю элемент, используя select или linq или любым другим способом, который я пробовал,спортивный объект всегда двухмерный, то есть он не идет глубже двух уровней во вложенных списках!Пример результата с использованием var sport=db.Sports.First() результат - {"id":1,"name":"Football","leagues":null} или если я использовал select ()

   var sportQuery = db.sports.Select(
     s=>new Sports(){
        id=s.id,
        leagues=s.leagues,
        name=s.name
    }).First();

Я все еще не получаю полную информацию {"id":1,"name":"Football","leagues":[{"id":1,"name":"fc","description":"Some Leauge","teams":null},{"id":2,"name":"al","description":"League","teams":null}]} почему это так!и как получить полный объект, подобный этому

{"id":1,"name":"Football","leagues":[{"id":1,"name":"fc","description":"Some Leauge","teams":[{"id":1,"name":"real madrid","successrate":null,"players":[{"id":1,"name":"Cristiano Ronaldo","age":21},{"id":2,"name":"Iniesta","age":38}]},{"id":2,"name":"Barcelona","successrate":null,"players":[{"id":1,"name":"Cristiano Ronaldo","age":21},{"id":2,"name":"Iniesta","age":38}]}]},{"id":2,"name":"al","description":"League","teams":[{"id":1,"name":"real madrid","successrate":null,"players":[{"id":1,"name":"Cristiano Ronaldo","age":21},{"id":2,"name":"Iniesta","age":38}]},{"id":2,"name":"Barcelona","successrate":null,"players":[{"id":1,"name":"Cristiano Ronaldo","age":21},{"id":2,"name":"Iniesta","age":38}]}]}]}

Я застрял на несколько дней, пожалуйста, любая помощь будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Попробуйте следующее:

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            DataBase db = new DataBase();

            var sportQuery = db.sports.Select(s=> s.leagues.Select(l => l.teams.Select(t => t.players.Select(p => new {
                        playerid =  p.id,
                        playerName = p.name,
                        playerAge = p.age,
                        teamId = t.id,
                        teamName = t.name,
                        teamSucessrate = t.successrate,
                        leagueId= l.id,
                        leagueName= l.name,
                        leagueDescription = l.description,
                        sportId = s.id,
                        sportName = s.name
            }))
            .SelectMany(p => p))
            .SelectMany(t => t))
            .SelectMany(l => l)
            .ToList();
        }
    }
    public class DataBase
    {
        public List<Sports> sports { get; set;}
    }

    public class Sports
    {
        public int id { get; set; }
        public string name { get; set; }
        public List<League> leagues { get; set; }
    }
    public class League
    {
        public int id { get; set; }
        public string name { get; set; }
        public string description { get; set; }
        public List<Team> teams { get; set; }
    }
    public class Team
    {
        public int id { get; set; }
        public string name { get; set; }
        public string successrate { get; set; }
        public List<Player> players { get; set; }
    }
    public class Player
    {
        public int id { get; set; }
        public string name { get; set; }
        public int age { get; set; }
    }
}
0 голосов
/ 17 октября 2018

проблема решена с помощью Include() и thenInclude() https://docs.microsoft.com/en-us/ef/core/querying/related-data, однако это не объясняет, почему Select() загружает только одно свойство списка в глубину, также кажется, что я должен иметь возможность загружать объект с помощью selectтолько или linq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...