我首先使用 Entity Framework Core 6 代码和 Postgresql 数据库,我发现 EF Core 生成不必要的复杂查询,该查询运行几秒钟,但可以优化到几毫秒。
我有一个基于
的优化查询dbContext.Set<xx>().ToQueryString()
我想使用
FromSqlRaw
方法运行它,但出现错误
列引用“id”不明确
在查询中有多个表,并且它们有 id 列,但在查询中它们带有别名,例如 a.id、b.id 等。即便如此,我仍然收到该错误。我该如何修复该错误?
我已经用另一种方式修复了性能。我必须加入的一些实体包含数十万条记录。最简单的查询
dbContext.Set<Invoice>()
.Include(x=> x.CreatedBy)
.Include(x=> x.Customer)
...
运行效率低下,因为 CreatedBy 和 Customer 实体有另一个连接,例如 Customers 和 Users 表可以有数十万条记录。
我所做的,我首先运行了一个简单的查询,
var inv = await dbContext.Set<Invoice>().Where(x=> x.Id == 'xxx').FirstOrDefaultAsync();
然后我将此对象的结果添加到相关对象的过滤器中
dbContext.Set<Invoice>()
.Where(x=> x.Id == 'xx' && x.CreatedBy.Id == inv.CreatedById && x.Customer.Id = inv.CustomerId)
.Include(x=> x.CreatedBy)
.Include(x=> x.Customer)
...
第一个查询运行了大约 2 分钟,第二个查询运行了几毫秒。
对我来说这看起来像是一个黑客,但确实有效。