我是实体框架的新手,希望对一些事情进行澄清.我理解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引擎根据与合格索引最匹配的显式条件返回数据.

请澄清基础操作.

推荐答案

我不是EF方面的专家,但不是所有表格都需要.

它不返回IEnumerable,而是返回IQueryable.它将基于linq语句生成一个SQL查询,并在SQL server上迭代时执行它(例如foreach循环).

您可以使用以下命令获取SQL查询:

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

Csharp相关问答推荐

使用C#中的Shape API从Azure目录获取所有用户

需要深入了解NpgSQL DateTimeOffset处理

如何创建ASP.NET Core主机并在同一进程中运行请求

ASP.NET MVC中创建视图的过滤器

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

System.Text.Json数据化的C#类映射

图形API基于appid列表检索多个应用程序

在实时数据库中匹配两个玩家的问题

将字节转换为 struct 并返回

C#多键字典和TryGetValue

CRL已过期,但ChainStatus告诉我RevocationStatus未知

忽略Visual Studio代码中的StyleCop规则

如何从SignalR获取连接客户端的域

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

在Unity C#中按键点击错误的参数

处理方法内部过滤与外部过滤

身份验证中间件如何处理多个方案

能否将我图表中的星号与X轴上一天中的第二位数字对齐?

C#:我需要根据换行符拆分字符串,而不是在字符串中用双引号分隔换行符

在SQL中删除少于24小时的令牌