2013-06-22 10 views
1

我有以下的库:如何查看由LINQ发送到我的数据库的SQL文本?

public class GenericRepository<T> : IRepository<T> where T : class 
{ 
    public GenericRepository(DbContext dbContext) 
    { 
     if (dbContext == null) 
      throw new ArgumentNullException("An instance of DbContext is required to use this repository", "context"); 
     DbContext = dbContext; 
     DbSet = DbContext.Set<T>(); 
    } 

    protected DbContext DbContext { get; set; } 

    protected DbSet<T> DbSet { get; set; } 

    public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate) 
    { 
     return DbSet.Where<T>(predicate); 
    } 

    public virtual IQueryable<T> GetAll() 
    { 

     return DbSet; 
    } 

和服务:

private IRepository<Subject> _subjectsRepository; 
    private IRepository<Content> _contentsRepository; 

    public ContentService(IRepositoryProvider repositoryProvider) 
     : base(repositoryProvider) 
    { 
     _subjectsRepository = GetStandardRepo<Subject>(); 
     _contentsRepository = GetStandardRepo<Content>(); 
    } 

    public IList<Content> GetContents(int subjectId, int contentTypeId, int contentStatusId) 
    { 
     var contents = _contentsRepository.GetAll() 
      .Where(a => a.SubjectId == subjectId && 
        a.ContentTypeId == contentTypeId && 
        (contentStatusId == 99 || 
        a.ContentStatusId == contentStatusId)) 
      .ToList(); 
     return contents; 
    } 

我想找到被发送到数据库的SQL文本。我知道我可以做到这一点:

db.GetCommand(query).CommandText 

但可能有人帮助我,告诉我,我应该把这个在我的代码。

我想找到被发送到数据库的SQL文本,我知道,我可以

+0

最简单的事情是使用sql profiler –

回答

6

做到这一点,您可以使用SQL Server profiler工具,SQL Server Management Studio中的一部分,看看服务器已经收到并执行了它。但是,这可能会影响性能,因此您不应该在生产服务器上运行它(除非您知道自己在做什么)。

其他选项正在使用第三方分析器 - 例如来自Hibernating Rhinos的商业Entity Framework Profiler,或者如果使用ASP.NET/MVC的开源码mini-profiler

+0

我想使用profiler,但我没有完整的管理工作室。我会研究一下小型剖面仪。谢谢 – Melina

+0

非常小的一点:小型探测器的核心工作在任何地方;只是我们只为asp.net写了一个UI –

2

您可以使用ToTraceString()跟踪由您的Linq Entities查询生成的SQL并将它们转储到日志中。

这样

public static string ToTraceString<T>(this IQueryable<T> query) 
{ 
    var objQuery = query as ObjectQuery<T>; 
    if (objQuery != null) 
    { 
     return string.Format("{0}{2}{1}{2}{2}", DateTime.Now, objQuery.ToTraceString(), Environment.NewLine); 

    } 

    return string.Empty; 
} 

扩展方法可以称为

var sql = _contentsRepository.GetAll().ToTraceString(); 
0

我建议使用LinqPad(http://www.linqpad.net/)。

使用LinqPad,您可以导入包含DataContext的自己的程序集并使用自己的DAL方法。见here

运行代码片段后,您可以切换为结果视图和SQL视图(等等)。这是我们在使用EntityFramework时找到的最好的工具。我们还能够更直接地调用我们的DAL,而无需通过顶层应用程序层。

相关问题