gpt4 book ai didi

c# - 在这种情况下,EF Core 生成的 SQL 效率很低,有什么解决方法吗?

转载 作者:行者123 更新时间:2023-12-04 13:33:24 26 4
gpt4 key购买 nike

以这样简单的实体为例:

public class Person
{
public int Id { get; set; }
public string MainEmail { get; set; }
}

public class Person_Email
{
public int Id { get; set; }
public int Id_Person { get; set; }
public string Email { get; set; }
}
这个查询: db.Person.Where(p => p.Person_Email.Any(c => c.Email == "myemail@email.com") || p.MainEmail == "myemail@email.com").FirstOrDefault();被翻译为:
SELECT TOP(1) [p].[Id]
FROM [Person] AS [p]

WHERE (EXISTS (
SELECT 1
FROM [Person_Email] AS [p1]
WHERE ([p].[Id] = [p1].[Id_Person]) AND ([p1].[Email] = N'myemail@email.com'))
OR ([p].[MainEmail] = N'myemail@email.com')
)
这非常慢,在我的数据库上,分析器显示 4347316 次读取和 2568 次持续时间)。
我会将 sql 写为:
SELECT TOP(1) [p].[Id]
FROM [Person] AS [p]

join [Person_Email] as pe on p.Id = pe.Id_Person
where p.MainEmail = N'myemail@email.com' or pe.Email = N'myemail@email.com'
在这种情况下,分析器显示 17448 次读取和 300 次持续时间。
我想知道是否有一种方法可以优化这种以不同方式编写 LINQ 查询的方法,或者我们只能等待 ef 核心团队对其进行改进(我尝试了 ef 核心 5.0 预览版 8,但没有任何变化)。

最佳答案

这个怎么样?

var person = (from a in db.Person
from b in db.Person_Email.Where(c => c.Id_Person == a.Id).DefaultIfEmpty()
where a.MainEmail == "myemail@email.com" || b.Email == "myemail@email.com"
select a).FirstOrDefault();
或者
var personemail = db.Person_Email.Where(c => c.Email == "myemail@email.com").FirstOrDefault();

var person = db.Person.Where(c => (personemail == null || c.Id == personemail.Id_Person) || c.MainEmail == "myemail@email.com").FirstOrDefault();
enter image description here

关于c# - 在这种情况下,EF Core 生成的 SQL 效率很低,有什么解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63658813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com