Entity Framework 小技巧五 —— 如何得到EF查询生成的SQL?

最近挺忙的,只能为大家带来一些使用EF的小技巧。有关EF4.1的使用与探索将在之后一段时间为大家奉上。今天为大家带来如何得到EF查询所生成的SQL。


在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL。 

复制代码
using  (var context  =   new  TestDBEntities())
{
    var query 
=  from p  in  context.Parents
                
where  p.Name  ==   " Lingzhi "
                select p;

    ObjectQuery
< Parent >  parents  =  query  as  ObjectQuery < Parent > ;
    
if  (parents  !=   null )
    {
        
string  sql  =  parents.ToTraceString();
    }
}
复制代码

这里所生成的SQL为:

SELECT  
[ Extent1 ] . [ ParentID ]   AS   [ ParentID ]
[ Extent1 ] . [ Name ]   AS   [ Name ]
FROM   [ dbo ] . [ Parent ]   AS   [ Extent1 ]
WHERE  N ' Lingzhi ' = [ Extent1 ] . [ Name ]


在EF 4.1中,我们可以直接调用DbQuery<>的ToString()方法得到所生成的SQL。

复制代码
using  (var context  =   new  MyDbContext())
{
    var people 
=  from p  in  context.People
                 
where  p.PersonID  >   100
                 select p;

    
string  sql  =  people.ToString();
}
复制代码

所生成的SQL是:

SELECT  
[ Extent1 ] . [ PersonID ]   AS   [ PersonID ]
[ Extent1 ] . [ Name ]   AS   [ Name ]
FROM   [ dbo ] . [ People ]   AS   [ Extent1 ]
WHERE   [ Extent1 ] . [ PersonID ]   >   100

 

大家应该已经猜到,这里的ToString()方法其实也就是调用了ObjectQuery<>的ToTraceString()方法。DbQuery<>.ToString() ==> System.Data.Entity.Internal.Linq.InternalQuery<>.ToString()方法,此方法在.NET Reflector得到的实现是这样的:

public   override   string  ToString()
{
    
return   this ._objectQuery.ToTraceString();
}

 

以上讨论的方法都只能得到普通Select查询所生成的SQL,像其他Loading啊,更新啊,删除啊,添加等所生成的SQL并不能得到。EF并不像LINQ to SQL有DataContext.Log可以得到所有被执行的SQL命令。要实现这样的功能,需要自己拓展一下EF的data provider,比如这个例子:http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32。(可能的话,以后会为大家详细介绍下这个很酷的provider)

 

当然我们也可以使用Visual Studio 2010 Ultimate所带的IntelliTrace功能或者SQL Server Profiler来得到EF所生成的SQL。 不过这两种方法只针对SQL Server和对应的T-SQL。

 

PS1:这里为大家带来一个好消息:微软一站式实例代码库(Microsoft All-In-One Code Framework)即日起正式迁移至MSDN代码库了,新的平台会帮您更轻松地解决开发难题、节省更多时间、获得更友好的用户体验。本人作为这个项目的元老,见到我们已拥有600多个经典的代码实例,甚感欣慰啊!  更详细信息,请看http://msdn.microsoft.com/zh-cn/hh124104.aspx?ocid=ban-f-cn-loc-OC201104-MSDN

最新的代码浏览器也发布啦!为大家带来了更多很cool的功能,比如1)代码按需下载 2)实例集中化管理  3)自动更新

http://blog.csdn.net/MSCodeSample/archive/2011/04/18/6331382.aspx 

之后我将尽力为大家带来更多有关EF的代码实例以及相关的介绍!



PS2:同事开发了一个很cool的MSDN论坛桌面小工具,绝对给力!欢迎使用!(我也出了不少力啊


也欢迎到MSDN中文论坛ADO.NET与LINQ论坛来提问EF的问题啊,可以试试直接报我的名字Michael Sun,哈哈! 

 

如需转发请注明原文出处,谢谢: http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Entity Framework (EF)创建多个新的SQL Server数据库,您可以按照以下步骤进行操作: 1. 首先,确保您的项目中已安装了Entity Framework的相关包。如果尚未安装,请在Visual Studio中使用NuGet包管理器安装Entity Framework。 2. 在您的项目中创建一个派生自`DbContext`的类,用于表示数据库上下文。您可以为每个数据库创建一个独立的上下文类。例如,假设您要创建两个数据库,一个是`Database1`,另一个是`Database2`,可以创建两个上下文类:`Database1Context`和`Database2Context`。 ```csharp using System.Data.Entity; public class Database1Context : DbContext { public Database1Context() : base("name=Database1ConnectionString") { } // 在这里定义Database1的实体集合 } public class Database2Context : DbContext { public Database2Context() : base("name=Database2ConnectionString") { } // 在这里定义Database2的实体集合 } ``` 在上述代码中,`Database1ConnectionString`和`Database2ConnectionString`是连接到相应SQL Server数据库的连接字符串。您可以根据您自己的配置进行更改。 3. 然后,您可以在每个上下文类中定义相应数据库的实体集合,这些实体将映射到各自数据库中的表。 4. 最后,您可以在代码中使用相应的上下文类来执行数据库操作。以下是一个示例: ```csharp // 使用Database1Context创建Database1的数据库 using (var context = new Database1Context()) { context.Database.Create(); // 在Database1中执行其他数据库操作 } // 使用Database2Context创建Database2的数据库 using (var context = new Database2Context()) { context.Database.Create(); // 在Database2中执行其他数据库操作 } ``` 在上述代码中,我们分别使用`Database1Context`和`Database2Context`来创建两个不同的数据库。您可以在相应的代码块中执行针对每个数据库的其他数据库操作。 通过按照以上步骤为每个数据库创建独立的上下文类,您可以使用Entity Framework同时管理多个SQL Server数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值