包含不适用于查询中的选择

时间:2021-06-30 12:13:32

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

我正在尝试在查询中使用 Include(),但它没有按我预期的那样工作。 我有一个名为 Bes 的表,其中包含以下列:

  • 身份证
  • 姓名
  • 豌豆
  • 小区标识
  • OpId

CeIdOpId 是此表的外键:

价格:

  • 身份证
  • 姓名

操作:

  • 身份证
  • 姓名

我想运行这个查询(它有效但不填充 CesOps 表)

var bes = await _context.Bes
            .Include(x => x.Ops)
            .Include(x => x.Ces)
            .Where(x => besWithXPs.Contains(x.Pesta))
            .GroupBy(x => x.Pesta)
            .Select(x => x.First())
            .ToListAsync();

我尝试在没有 Select()OpsCes 的情况下使用此查询,但我只想要每个 Pesta 一个 Bes(这就是 GroupBy 和 { {1}})

有人知道发生了什么吗?

顺便说一句,我使用 Entity Framework Core 和 .NET Core 2

1 个答案:

答案 0 :(得分:0)

我认为你应该添加

    [JsonIgnore]
    public Ces Ce { get; set; }

    [JsonIgnore]
    public Ods Od { get; set; }

添加到您的模型中以便包含它们,然后执行:

var bes = await _context.Bes.AsNotracking()
        .Include(x => x.Ops)
        .Include(x => x.Ces)
        .Where(x => besWithXPs.Contains(x.Pesta))
        .GroupBy(x => x.Pesta)
        .FirstOrDefaultAsync();

1 - AsNoTracking 的作用: Entity Framework 公开了许多性能调优选项,以帮助您优化应用程序的性能。这些调整选项之一是 .AsNoTracking()。此优化允许您告诉实体框架不要跟踪查询的结果。这意味着实体框架不会对查询返回的实体执行额外的处理或存储。但是,这也意味着您无法在不将它们重新附加到跟踪图的情况下更新这些实体。

2 - 更改“.Select(x => x.First()).ToListAsync();”到“.FirstOrDefaultAsync();”。仅当您想要获取某些属性或需要一个包含您收到的数据的新类时才使用 .Select。