Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6 Linq查询。仅包含返回子表的第一个条目_C#_Entity Framework_Linq_Sqlite_Entity Framework 6 - Fatal编程技术网

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

}