C# 如何在嵌套响应中获取一对多关系的多实体?
我有一部班级电影C# 如何在嵌套响应中获取一对多关系的多实体?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我有一部班级电影 public class Movie { public int Id { get; set; } public string Name { get; set; } public Producer ProducerName { get; set; } } 还有一个班级制作人 public class Producer { public int Id { get; set; }
public class Movie
{
public int Id { get; set; }
public string Name { get; set; }
public Producer ProducerName { get; set; }
}
还有一个班级制作人
public class Producer
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Movie> Movies { get; set; }
}
我得到以下信息:
{
"id": 1,
"name": "Venom",
"producerName": {
"id": 2,
"name": "Amy Pascal",
"movies": [
{
"id": 1,
"name": "Venom"
}
]
}
}
我想在同一个查询中查询与制片人关联的所有电影
像
我该怎么做
编辑:使用其中一个答案中的查询,我只收到该制作人的一部电影,而不是全部电影。
我查看了数据库,发现尽管制片人和电影之间是一对多的关系,但同一个制片人插入了多行,主键不同。我的问题在这里有点不同。我正在使用json对数据库进行种子设定。IDsPK是由数据库生成的
用于为数据库种子的JSON:
[
{
"Name": "Venom",
"ProducerName":
{
"Name": "Steven Spielberg"
}
},
{
"Name": "Kung Fu League",
"ProducerName":
{
"Name": "Steven Spielberg"
}
}
]
我如何约束EF Core不为同一制片人创建重复行,也不为同一制片人生成不同的密钥,这样我就可以成功接收单个制片人的所有电影 您可以链接包含。首先从电影开始,然后是制片人,最后使用包含制片人的电影 更新: 正如@Gert Arnold在投影时指出的,不返回实体,EF Core,因此,如果使用我的选项投影到其他对象,您可以删除包含 因此:
您是否希望在每部电影下为制片人提供完整的电影列表?你需要再打一个电话给电影制作人。您可以将其添加为子包含或选择,但我没有选中。var result=\u context.Producers.Includep=>p.Movies.ToList;不,我想获取电影列表,包括电影制片人,并获取制片人在同一通话中制作的所有电影。我们在多对多的关系中得到了这一点。但这是一对多的关系。获取嵌套调用有点混乱。您让我感兴趣,尝试了一些东西:Include和thenclude在这里没有任何效果。你可以移除它们,怎么会呢?我刚刚测试了这个,并且确信它是有效的,这正是OP想要的。可能不是最有效的查询,但这不是问题所在,至少在我看来是这样。我没有说它不起作用,但投影不需要包含它们,甚至不需要从查询中删除它们。看,啊,忘了,你说得对。我看到了它上周发出的警告,真有趣。谢谢你指出这一点谢谢你的回答。Include查询只返回制作人的当前电影。我查看了数据库,发现尽管制片人和电影之间是一对多的关系,但同一个制片人插入了多行,主键不同。我的问题在这里有点不同。我正在使用json对数据库进行种子设定。IDsPK是由数据库生成的。如何约束EF核心不为同一生产者创建重复行,也不为同一生产者生成不同的键?
{
"id": 1,
"name": "Venom",
"producerName": {
"id": 2,
"name": "Amy Pascal",
"movies": [
{
"id": 1,
"name": "Venom"
},
{
"id": 56,
"name": "something"
},
{
"id": 81,
"name": "else"
}
]
}
}
[
{
"Name": "Venom",
"ProducerName":
{
"Name": "Steven Spielberg"
}
},
{
"Name": "Kung Fu League",
"ProducerName":
{
"Name": "Steven Spielberg"
}
}
]
// use .Include and .ThenInclude when returning your entities
var returningEntities = context.Movies
.Include(p => p.ProducerName)
.ThenInclude(m => m.Movies).ToList();
// No need for Include when use projection
var returningAnonymousObject = context.Movies
.Select(a => new
{
id = a.Id,
name = a.Name,
producer = new
{
id = a.ProducerName.Id,
name = a.ProducerName.Name,
movies = a.ProducerName.Movies.Select(m => new
{
id = m.Id,
name = m.Name
})
}
}).ToList();