揭开Entity Framework LINQ查询的一点面纱
2011-03-31 17:11
393 查看
下班前,给大家分享一下今天研究Entity Framework的LINQ查询的一点小收获。
先看LINQ查询代码(是一个JOIN查询):
这看似一个查询,实际没有进行实际数据的查询,但Entity Framework确实在数据库中进行了查询。有些绕口,还是看代码,看真相。
result.ToString()的输出结果是:
Entity Framework生成了上面的SQL语句(很标准的INNER JOIN查询),但没有把它交给数据库。
同时,我们用SQL Server Profiler监视Entity Framework的一举一动,看有没有黑幕...
嘿嘿,逮个正着,Entity Framework偷偷与数据库进行两次交易:
第一次交易:
第二次交易:
第二个交易让人莫明其妙,数据库中根本不存在[EdmMetadata]这个表,如果比喻一下,就是说Entity Framework想敲诈数据库的钱,可数据库没钱,这不是浪费感情嘛。
拒绝黑幕,拒绝浪费感情,目前找到了禁止第二个交易的方法:
但第一个交易还不能确定是不是黑幕,也不知道如何禁止。
先看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>(); } }
但第一个交易还不能确定是不是黑幕,也不知道如何禁止。
相关文章推荐
- Entity framework lambda/ linq like 模糊查询
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #3 -- LINQ-to-SQL、EntitySQL、查询产生器方法(Query builder)三种语法
- EntityFramework Linq查询
- Entity framewrok (linq to entity)查询优化的一点摸索
- Entity framewrok (linq to entity)查询优化的一点摸索
- EntityFramework.Extended 实现Linq 动态查询和动态条件
- EntityFramework linq 多条件查询,不定条件查询
- AEF横空出世——揭开ADO.NET Entity Framework的面纱
- EntityFramework Linq 按年月统计查询
- AEF横空出世——揭开ADO.NET Entity Framework的面纱
- [转]LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework
- EntityFramework Core 2.0执行原始查询如何防止SQL注入?
- linq to entity(两个entity的连接查询)
- Ado.net Entity Framework 中的多对多查询
- [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)
- Entity Framework 的多条件组合查询和 LIKE 查询(Combination search and simulate LIKE search with Entity Framework)
- EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景:
- Entity Framework linq
- ado.net entity framework使用不同的方法查询数据的不同性能
- 【转】ADO.NET Entity Framework ESQL查询语句