【问题标题】:Querying object with list of lists of lists使用列表列表查询对象
【发布时间】:2018-10-18 01:54:45
【问题描述】:

我想查询数据库并获取一个包含所有内部列表的运动对象,但由于某种原因我丢失了,选择仅在列表中深入 2 级,任何更深,并且列表属性的值为 @987654322 @, 结构示例

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 或我尝试过的任何其他方式调用项目时,运动对象始终是 2 维的,这意味着它不会比嵌套列表中的两个级别更深!使用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}]}]}]}

我已经被困了好几天了,如果有任何帮助,将不胜感激

【问题讨论】:

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


【解决方案1】:

尝试以下:

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

【讨论】:

    【解决方案2】:

    使用Include()thenInclude() 解决的问题 https://docs.microsoft.com/en-us/ef/core/querying/related-data 但是,这并不能解释为什么Select() 只加载一个列表属性深,而且似乎我应该能够使用 select only 或 linq 加载对象

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多