gpt4 book ai didi

c# - 如果我在不同时间使用同一 Linq 查询的不同字段, Entity Framework 是否会多次查询数据库?

转载 作者:行者123 更新时间:2023-11-30 14:49:13 28 4
gpt4 key购买 nike

我尝试了 Internet 和 SOF,但找不到有用的资源。也许我可能没有使用正确的措辞进行搜索。如果由于这个原因我错过了任何以前的问题,请告诉我,我会记下这个问题。


我正在处理一个繁忙的数据库,因此我需要向数据库发送较少的查询。

如果我从代码的不同级别访问同一 Linq 查询的不同列,那么 Entity Framework 是否足够智能以预见所需的列并将它们全部提供,或者它会调用数据库两次?

例如。

var query = from t1 in table_1
join t2 in table_2 on t1.col1 equals t2.col1
where t1.EmployeeId == EmployeeId
group new { t1, t2 } by t1.col2 into grouped
orderby grouped.Count() descending
select new { Column1 = grouped.Key, Column2 = grouped.Sum(g=>g.t2.col4) };

var records = query.Take(10);

// point x
var x = records.Select(a => a.Column1).ToArray();

var y = records.Select(a => a.Column2).ToArray();

EF 是否生成两次查询数据库以促进 x 和 y(首先发送一个查询以获取 Column1,然后发送另一个查询以获取 Column2),或者它是否足够聪明,知道它需要两个列都被具体化并将它们都带入在x点

添加以阐明问题的意图:

我知道我可以简单地在 query.Take(10) 的末尾添加一个贪心方法并完成它,但我试图了解我尝试的方法(在我看来,更优雅)是否有效请不要让 EF 提出两个查询。

最佳答案

是的,目前您的代码将生成 2 个将对数据库执行的查询。原因是因为您生成了 2 个不同的 sql:

  1. 首先是top查询,只取10条记录然后只取Column1
  2. 其次是top查询,只取10条记录然后只取Column2

这些是 2 个查询的原因是因为您在不同的 Select 语句上有一个 ToArray -> 生成不同的 sql。大多数 linq 查询都是不同执行的,只有当您使用 ToArray()/ToList()/FirstOrDefault() 和等等 - 那些实际上给你具体数据的。在您的原始查询中,您对尚未检索到的数据有 2 个不同的 ToArray - 这意味着 2 个查询(一次针对第一个字段,然后针对第二个字段)。

以下代码将导致对数据库的单个查询

var records = (from t1 in table_1
join t2 in table_2 on t1.col1 equals t2.col1
where t1.EmployeeId == EmployeeId
group new { t1, t2 } by t1.col2 into grouped
orderby grouped.Count() descending
select new { Column1 = grouped.Key, Column2 = grouped.Sum(g=>g.t2.col4) })
.Take(10).ToList();

var x = records.Select(a => a.Column1).ToArray();
var y = records.Select(a => a.Column2).ToArray();

在我上面的解决方案中,我添加了一个 ToList() 后只过滤掉你需要的数据 (Take(10)) 然后在那个时候它会执行到数据库。然后,所有数据都在内存中,您可以对其执行任何其他 linq 操作,而无需再次访问数据库。


ToString() 添加到您的代码中,以便您可以在不同的点检查生成的 sql。然后你就会明白什么时候执行了什么:

var query = from t1 in table_1
join t2 in table_2 on t1.col1 equals t2.col1
where t1.EmployeeId == EmployeeId
group new { t1, t2 } by t1.col2 into grouped
orderby grouped.Count() descending
select new { Column1 = grouped.Key, Column2 = grouped.Sum(g=>g.t2.col4) };
var generatedSql = query.ToString(); // Here you will see a query that brings all records

var records = query.Take(10);
generatedSql = query.ToString(); // Here you will see it taking only 10 records


// point x
var xQuery = records.Select(a => a.Column1);
generatedSql = xQuery.ToString(); // Here you will see only 1 column in query

// Still nothing has been executed to DB at this point

var x = xQuery.ToArray(); // And that is what will be executed here

// Now you are before second execution

var yQuery = records.Select(a => a.Column2);
generatedSql = yQuery.ToString(); // Here you will see only the second column in query

// Finally, second execution, now with the other column

var y = yQuery.ToArray();

关于c# - 如果我在不同时间使用同一 Linq 查询的不同字段, Entity Framework 是否会多次查询数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223419/

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