gpt4 book ai didi

c# - 由于派生表, Entity Framework 很慢

转载 作者:可可西里 更新时间:2023-11-01 06:30:54 25 4
gpt4 key购买 nike

我将 MySQL Connector/Net 6.5.4 与 LINQ to entities 结合使用,并且我经常获得糟糕的查询性能,因为 Entity Framework 生成使用派生表的查询。

这是我多次遇到的简化示例。在 C# 中,我编写了如下查询:

var culverCustomers = from cs in db.CustomerSummaries where cs.Street == "Culver" select cs;
// later...
var sortedCustomers = culverCustomers.OrderBy(cs => cs.Name).ToList();

而不是像这样生成简单的查询:

SELECT cust.id FROM customer_summary cust WHERE cust.street = "Culver" ORDER BY cust.name

Entity Framework 生成一个带有派生表的查询,如下所示:

SELECT Project1.id FROM (
SELECT cust.id, cust.name, cust.street FROM customer_summary cust
WHERE Project1.street = "Culver"
) AS Project1 -- here is where the EF generates a pointless derived table
ORDER BY Project1.name

如果我解释这两个查询,我会得到第一个查询:

id, select_type, table, type, possible_keys, rows
1, PRIMARY, addr, ALL, PRIMARY, 9
1, PRIMARY, cust, ref, PRIMARY, 4

...还有像 Entity Framework 查询这样糟糕的东西

id, select_type, table,      type, possible_keys, rows
1, PRIMARY, <derived2>, ALL, 9639
2, DERIVED, addr, ALL, PRIMARY, 9
2, DERIVED, cust, ref, PRIMARY, 4

注意第一行,MySQL 解释说它正在扫描 9000 多条记录。由于派生表,MySQL 正在创建一个临时表并加载每一行。 (或者我是根据这样的文章推断的:Derived Tables and Views Performance)

如何防止 Entity Framework 使用派生表,或者如何说服 MySQL 对此类查询进行明显的优化?

为了完成,这里是这个 linq 查询的源 View :

create view  customer_summary as
select cust.id, cust.name, addr.street
customers cust
join addresses addr
on addr.customer_id = cust.id

最佳答案

我认为您的查询语句缺少“选择”。您尚未确定所需的记录。 您的查询:

var culverCustomers = from cs in db.CustomerSummaries 
where cs.Street == "Culver";

//不选择

您要从表格中选择什么?试试这个

例子:

var culverCustomers =  from cs in db.CustomerSummaries 
where cs.Street == "Culver"
select cs;

关于c# - 由于派生表, Entity Framework 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201049/

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