C# EF6 Linq查询。仅包含返回子表的第一个条目
我想为给定的口袋妖怪检索一个遭遇列表,因为口袋妖怪可以在很多地方遇到,所以我一直在尝试许多不同的方法C# EF6 Linq查询。仅包含返回子表的第一个条目,c#,entity-framework,linq,sqlite,entity-framework-6,C#,Entity Framework,Linq,Sqlite,Entity Framework 6,我想为给定的口袋妖怪检索一个遭遇列表,因为口袋妖怪可以在很多地方遇到,所以我一直在尝试许多不同的方法 var currentPokemon = _context.Pokemon .Where(mon => mon.Id == id) .Include(mon => mon.Encounters)
var currentPokemon = _context.Pokemon
.Where(mon => mon.Id == id)
.Include(mon => mon.Encounters)
.FirstOrDefault();
结果是一个Pokemon对象,包含所有相关数据,但仅检索第一次相遇并将其放入集合,从而产生以下结果:
查看数据库,caterpie大约有20次遭遇战,我想访问所有遭遇战,但只有一次
口袋妖怪类的外观(不相关字段省略):
Db数据:
我在这里误解了什么?我想这是因为您正在调用
.FirstOrDefault()
,它只获取第一项。你能省略它并添加.ToList()
?另外,var currentPokemon
似乎不是一个好的变量名。你说你想要一份遭遇的清单,对吗?关于var pokemonEncounters
?我认为问题在于使用ForeignKey和InverseProperty设置关系的方式
尝试重写为以下内容:
[Table("Pokemon")]
public class Pokemon
{
public int Id { get; set; }
public string Name { get; set; }
[InverseProperty("Pokemon")]
public ICollection<Encounter> Encounters { get; set; }
}
[Table("Enconters")]
public class Encounter
{
public int Id { get; set; }
public int PokemonId { get; set; }
[ForeignKey("PokemonId")]
public Pokemon Pokemon { get; set; }
}
[表格(“口袋妖怪”)]
公共类口袋妖怪
{
公共int Id{get;set;}
公共字符串名称{get;set;}
[反向财产(“口袋妖怪”)]
公共ICollection遇到{get;set;}
}
[表格(“输入”)]
公开课
{
公共int Id{get;set;}
public int PokemonId{get;set;}
[外键(“口袋妖怪”)]
公共口袋妖怪口袋妖怪{get;set;}
}
对不起,我找错地方了。在调试器中逐步完成此操作后,我可以看到我的口袋妖怪查询确实返回了所需的结果:一个附带了许多遭遇的口袋妖怪。我的问题似乎在别处(特别是:我看到的JSONified对象通过我的web前端截断了Conferences数组,只包含第一个结果)
我将发布一个带有正确问题的新问题,并在问题解决后从这里链接到该问题。首先或默认将在口袋妖怪结果上执行,而不是Fredou所说的遭遇。省略
.FirstOrDefault()
只返回一个长度为1的口袋妖怪数组,这是毫无意义的,因为我只想得到1个口袋妖怪。至于我要找的,它是一个口袋妖怪,上面有一个列表,上面列出了所有与它相关的遭遇。用通俗易懂的英语,我想问“谁是口袋妖怪10”并得到“口袋妖怪10是Caterpie,你可以在以下位置找到Caterpie:(位置列表)。”在最后添加.ToList()
会得到一个遭遇列表,但没有口袋妖怪。var currentPokemon=\u context.pokemon.Where(mon=>mon.Id==Id).Include(mon=>mon.conferences).FirstOrDefault().Select(p=>p.conferences);不能对.FirstOrDefault()返回的Pokemon对象调用.Select()
@Fredou和@Riwen-你是对的。现在我想起来了,var currentPokemon=\u context.Pokemon.Include(mon=>mon.conferences.FirstOrDefault(p=>p.Id=Id)
应该返回第一个Pokemon,其中包含一个遭遇列表。您应该能够使用currentPokemon.Conferences来访问遭遇。正确吗?生成的sql是什么?联机查看如何获取sql查询可以显示db的记录吗?您引用的db正确吗?@sampath您引用的db正确吗?我无法用全新的DbContext和最少的数据重现这种行为。我得到了口袋妖怪和遭遇战,正如预期的那样。你没有展示的代码中肯定还有其他东西。你发布的代码还可以,你执行操作的顺序虽然不是最优的,但确实生成了相同的sql。是的,找到了一个js输出中的序列化错误。好的,问题是JSON序列化程序检测到一个自引用循环(因为Pokemon引用了Conferences,Conferences引用回Pokemon),并在调试输出中抛出一个错误(我多次错过),以避免进入无限循环。此问题的解决方案如下:
public partial class Encounters {
.
.
.
[ForeignKey("PokemonId")]
[InverseProperty("Encounters")]
public virtual Pokemon Pokemon { get; set; }
}
[Table("Pokemon")]
public class Pokemon
{
public int Id { get; set; }
public string Name { get; set; }
[InverseProperty("Pokemon")]
public ICollection<Encounter> Encounters { get; set; }
}
[Table("Enconters")]
public class Encounter
{
public int Id { get; set; }
public int PokemonId { get; set; }
[ForeignKey("PokemonId")]
public Pokemon Pokemon { get; set; }
}