原文连接 https://www.cnblogs.com/fuyouchen/p/9388251.html
一、原理:
如何查看真正执行的SQL是怎样的?
DbContext有一个Database属性,Database属性有一个Log属性,是Action委托类型其中的参数就是sql语句,每次EF执行sql语句的时候都会执行Log,因此就知道执行了什么sql;
EF的查询是“延迟执行”的,只有遍历结果集的时候才执行select查询,Tolist()内部也是遍历结果集形成的List;
static void Main(string[] args)
{
using (TestDbContext ctx = new TestDbContext())
{
ctx.Database.Log = sql =>
{
Console.WriteLine(sql);
};
var ps= ctx.Persons.Where(p => p.Id <4);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">开始执行了</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> p <span style="color: #0000ff;">in</span><span style="color: #000000;"> ps)
{
Console.WriteLine(p.ToString());
}
Console.ReadKey();
}
}</span></pre>
long[] ids = { 2, 5, 8 }; var result = ctx.Persons.Where(p => ids.Contains(p.Id));
result.toList();
//二次过滤,在sql中自动拼接。 long[] ids = { 2, 5, 8 }; var result = ctx.Persons.Where(p => ids.Contains(p.Id)); result = result.Where(p => p.Name.Length > 5);
EF多次指定where来实现动态的复合检索; select返回值必须写成IQueryable<Person>
EF是夸数据库的,如果迁移到Mysql数据库上,就会编译成Mysql语法。要配置对应数据库的EntityFrameworkProvider
每次执行_MigrationHistory 是DBMigration用的,也就是EF帮我们建数据库,可以禁用:
Database.SetInitializer<****DbContext>(null)
二、执行原始Sql语句:
在一些特殊的场合,需要执行原生的SQL。
执行非查询语句:调用DbContext 的Database 属性的ExecutesqlCommand 方法,可以通过占位符的方式传递参数:
using (TestDbContext ctx = new TestDbContext())
{
</span><span style="color: #0000ff;">string</span> name = <span style="color: #800000;">"</span><span style="color: #800000;">Tony</span><span style="color: #800000;">"</span><span style="color: #000000;">;
ctx.Database.ExecuteSqlCommand(</span><span style="color: #800000;">"</span><span style="color: #800000;">insert into T_Persons(Name,CreateDateTime) values({0},GetDate())</span><span style="color: #800000;">"</span><span style="color: #000000;">, name);
Console.ReadKey();
}</span></pre>
执行查询语句:
static void Main(string[] args)
{
using (TestDbContext ctx = new TestDbContext())
{
</span><span style="color: #0000ff;">var</span> result= ctx.Database.SqlQuery<GroupCount>(<span style="color: #800000;">"</span><span style="color: #800000;"> select Age,COUNT(*) as GroupCounts from T_Persons group by Age </span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> result)
{
Console.WriteLine(item.Age</span>+<span style="color: #800000;">"</span><span style="color: #800000;">=</span><span style="color: #800000;">"</span>+<span style="color: #000000;">item.GroupCounts);
}
Console.ReadKey();
}
}</span></pre>
public class GroupCount { public int Age { get; set; } public int GroupCounts { get; set; } }
三、EF对象的状态
EF中的对象有五个状态: Derached(游离态,脱离态),Unchange(未改变),Added(新增),Deleted(删除),Modified(被修改)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)