我是实体框架的新手,希望对一些事情进行澄清.我理解DbContext
,比如用连接字符串指向SQL数据库.在DbContext
中,您声明DbSet<perEachTable>
,希望/计划从所述SQL数据库中公开和获取数据.
现在,您进入了LINQ,我了解了一些链接,例如事物的可枚举列表和查找某些限定where条件条目.
现在,我更大的问题是EF如何查询.您有一个指向SQL Server的DbContext
.它有一张约25万客户的表格.它的主键定义为Id
(或CustomerId
),这是预期的.您希望根据用户的邮箱地址(预期查询的常见类型)查询和查找客户.customer表在邮箱上有一个索引.
在我看到的LINQ查询中,它引用了任意表的DbSet
,并运行where子句,例如
using (var context = new DBCustomers())
{
var query = context.Customer
.Where(c => c.EMail == "someEMail@whereEver.com")
.FirstOrDefault<Customer>();
}
我的 idea 是,整个客户列表正在从其DbSet上下文中删除.然后它运行link WHERE
子句来查找邮箱.我不想每次都为了LINQ迭代而让25万客户流失.
为什么WHERE
并没有实际使用整个客户数据集(尤其是当它继续增长时),而只是基于可用的索引进行优化,而实际上并没有将所有内容都拉下来.
这只是一个应用的魔法黑盒,EF只会将符合条件的最终条目交给您(或者如果其他更开放的查询,则交给您很少的条目).
我还见过使用完全编写的SQL语句和参数化的EF Core实例,这是我比较习惯的做法.让SQL Server引擎根据与合格索引最匹配的显式条件返回数据.
请澄清基础操作.