c# - 更好地了解 Entity Framework Core 查询和 DbSet 影响

标签 c# sql-server linq entity-framework-core

我是 Entity Framework 的新手,希望对某些事情进行澄清。我明白DbContext例如使用连接字符串指向 SQL 数据库。 DbContext内,您声明 DbSet<perEachTable>您想要/计划从所述 SQL 数据库公开并获取数据。

现在,您进入了 LINQ,我了解了一些链接,例如可枚举的事物列表以及查找某些符合条件的 where 条件条目。

现在,我更大的问题是 EF 如何查询。你有一个DbContext指向 SQL Server。它有一张 table ,可以容纳 25 万顾客。它的主键定义为 Id (或 CustomerId )这是预期的。您想要根据用户的电子邮件地址查询和查找客户(常见的预期查询类型)。客户表在电子邮件上有一个索引。

在我见过的 LINQ 查询中,它指的是 DbSet任何表并运行 where 子句,例如

using (var context = new DBCustomers())
{
    var query = context.Customer
                       .Where(c => c.EMail == "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c2f33313919113d35301c2b34392e39192a392e723f3331" rel="noreferrer noopener nofollow">[email protected]</a>")
                       .FirstOrDefault<Customer>();
}

我的想法是,整个客户列表正在从其 DbSet 上下文中拉出。然后它运行链接 WHERE查找电子邮件的子句。我不认为我想每次都拉下 25 万个客户,只是为了 LINQ 迭代它们。

WHERE怎么了?实际上并没有使用客户的整个数据集(特别是当它继续增长时),只是根据可用的索引进行优化,并且实际上并没有将所有数据都拉下来。

这是否只是一个正在应用的神奇黑盒,EF 只是向您提供符合条件的最终条目(或者如果其他更开放的查询,则很少)。

我还看到过使用完全编写的 SQL 语句和参数化的 EF Core 实例,这是我更习惯做的事情。让 SQL Server 引擎根据与合格索引最匹配的显式标准返回数据。

感谢对基础操作的澄清。

最佳答案

我不是 EF 方面的专家,但是,不要求提供整个表格。

它不会返回一个 IEnumerable 而是一个 IQueryable 它会根据 linq 语句生成一个 SQL 查询,并在迭代时在 sql-server 上执行它通过(例如 foreach 循环)。

您可以使用以下方式获取 SQL 查询:

var query = context.Customer.Where(x => x.Id == 1);
Console.WriteLine(query.ToQueryString());

关于c# - 更好地了解 Entity Framework Core 查询和 DbSet 影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72680615/

相关文章:

.net - 使用 Linq 查询集合的集合

c# - 复杂的 Linq 分组

mysql - 使用不同数据库的数据库和模式之间的区别?

sql-server - 将日期转换为 varchar,然后将其转换回日期

c# - List<string> 上的不同运算符

c# - 如何组织自定义 SQl 查询集合

sql - 无法在 where 子句中使用临时列?

c# - 使用内存中查询实现自定义 QueryProvider

c# - 将 C# 对象发送到 webapi Controller

c# - .NET 是否有任何可用的方法来获取两个字符串的差异?