我是 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/