【问题标题】:Entity Framework Core 3.0 - Lambda expression used inside Include is not validEntity Framework Core 3.0 - Include 中使用的 Lambda 表达式无效
【发布时间】:2019-12-19 23:48:37
【问题描述】:

下面我在 LINQ Includes 中使用 lambda 表达式为 1 级,使用三个实体获取客户列表,主要的是所有客户,并且只有 2 个属性 Id 和 bool:IsCompany,第二个只有那些是公司的,而第三个只有那些是个人的。下面的代码使用 .Net Core 2.2 工作,当我更新到 3.0 时它停止工作,我能找到的大多数是多层次的解决方案,例如 Include -> ThenIclude不能在这里工作。 而版本3.0 breaking changes就没有提到这个案例了。

    public async Task<ActionResult<IEnumerable<CustomersListVM>>> GetCustomers()
    {
        List<CustomersListVM> customerList = await _context.Customers
            .Include(p => p.Company.Name)
            .Include(p => p.Individual.Name)
            .Select(p => new CustomersListVM
            {
                Id = p.Id,
                CustomerId = p.CustomerId,
                Name = p.IsCompany == true ? p.Company.Name : p.Individual.LastName + ' ' + p.Individual.FirstName
            }).ToListAsync();

        return customerList;
    }

有什么想法吗?

【问题讨论】:

  • 我没有解释这个变化,但我一直在做多级包含的方式是Include("Full.Path.ToChild"),它工作正常
  • 我这里只使用了一层
  • 删除包含子句中的.Name
  • @James,谢谢你,它有效,出于性能原因,我只包括属性。现在响应速度有点慢,但它有效。请做出你的回答。
  • @Sami-L 我建议完全删除它们。 Select 处理您需要加入 Compay 和 Individual 表的事实。

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


【解决方案1】:

Include 子句用于检索相关对象。应该使用指定链接实体的 lambdas 调用方法,但不要声明 .Name(因为这是一个属性):

.Include(p => p.Company)
.Include(p => p.Individual)

然后在Select方法中,指定只需要公司/个人的Name

【讨论】:

  • 仅从性能的角度来看,对于 EF 3.0 版本,我认为需要研究如何仅使用属性而不是整个实体。因为它在 2.2 中的问题代码中工作。但感谢您的提示,我很高兴它再次起作用。
猜你喜欢
  • 2020-09-30
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多