Entity Framework Core 3.0 - Include 内使用的 Lambda 表达式无效

19

在下面的示例中,我在LINQ Includes中使用lambda表达式来获取三个实体中的客户列表,其中主要实体是所有客户,仅具有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;
    }

有任何想法吗?


2
我对这个变化没有解释,但是我一直使用的多级包含方式是 Include("Full.Path.ToChild"),它可以正常工作。 - Matt U
2
在Include子句中删除“.Name”。 - James
@James,谢谢你,它起作用了,我只包含了性能原因的属性。响应现在有点慢,但它可以工作。请回答。 - Sami-L
@James 存储过程是个好主意,但是我可能需要使用不同的数据库提供商,我该怎么做呢? - Sami-L
2
@Sami-L 我建议完全删除它们。Select 会处理你需要连接到 Compay 和 Individual 表的事实。 - juharr
显示剩余10条评论
1个回答

20

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

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

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


仅从性能角度考虑,我认为需要研究如何仅使用属性而不是整个实体来使用EF 3.0版本。因为在2.2中,它可以像问题代码中一样工作。但感谢您的提示,我很高兴它又可以正常工作了。 - Sami-L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接