2013-06-22 46 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,而無需通過頂層應用程序層。

相關問題