揭开Entity Framework LINQ查询的一点面纱
下班前,给大家分享一下今天研究Entity Framework的LINQ查询的一点小收获。
先看LINQ查询代码(是一个JOIN查询):
using (BlogDbContext context = new BlogDbContext())
{
var result = (from e in context.BlogEntries
join t in context.PostTexts
on e.ID equals t.ID
where e.ID == 3560
select new
{
Title = e.Title,
Body = t.Text
}
);
Console.WriteLine(result.ToString());
}
这看似一个查询,实际没有进行实际数据的查询,但Entity Framework确实在数据库中进行了查询。有些绕口,还是看代码,看真相。
result.ToString()的输出结果是:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Title] AS [Title],
[Extent2].[Text] AS [Text]
FROM [dbo].[blog_Content] AS [Extent1]
INNER JOIN [dbo].[CNBlogsText__blog_PostBody] AS [Extent2] ON [Extent1].[ID] = [Extent2].[ID]
WHERE 3560 = [Extent1].[ID]
Entity Framework生成了上面的SQL语句(很标准的INNER JOIN查询),但没有把它交给数据库。
同时,我们用SQL Server Profiler监视Entity Framework的一举一动,看有没有黑幕...
嘿嘿,逮个正着,Entity Framework偷偷与数据库进行两次交易:
第一次交易:
SELECT Count(*) FROM sys.databases WHERE [name]=N'CNBlogsData'
第二次交易:
SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[ModelHash] AS [ModelHash]
FROM [dbo].[EdmMetadata] AS [Extent1]
ORDER BY [Extent1].[Id] DESC
第二个交易让人莫明其妙,数据库中根本不存在[EdmMetadata]这个表,如果比喻一下,就是说Entity Framework想敲诈数据库的钱,可数据库没钱,这不是浪费感情嘛。
拒绝黑幕,拒绝浪费感情,目前找到了禁止第二个交易的方法:
public class BlogDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
}
但第一个交易还不能确定是不是黑幕,也不知道如何禁止。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
2007-03-31 向大家汇报一下3月份博客园的访问量情况
2004-03-31 JGTM'2004 [MVP]的回信
2004-03-31 博客园对发表文章的一些要求
2004-03-31 发表文章的要求
2004-03-31 博客园成立了管理团队